首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在数据更改后,ListView不更新

在数据更改后,ListView不更新
EN

Stack Overflow用户
提问于 2016-10-26 10:18:09
回答 1查看 87关注 0票数 3

我使用两个ListViews (List1有数据,List2是空的)。

用户可以输入一个名称作为输入,如果List1包含名称并按下add Button,那么标记应该减少1,并且两个ListViews都应该被更新。

示例:

如果List1有10个标记,并且输入了一个名称,那么List1的标记应该设置为9,List2的标记应该设置为1。

如果我们这样做了10次,那么应该删除List1名称,并且List2的标记设置为10。

示例2:

假设List1将标记设置为8,List2标记设置为2。如果按下子按钮,则应同时添加两个列表。此时,应该删除List2,而List1的总分应为10。

下面是我使用过的逻辑,但是它不工作,它正在创建多个行和标记,这些行和标记没有正确地更新。

HomeAct类

代码语言:javascript
运行
复制
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle; 
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;

public class HomeAct extends Activity {

List<DocItem> docDet1 = new ArrayList<DocItem>();
List<DocItem> docDet2 = new ArrayList<DocItem>();
ListView lv1, lv2;
EditText editText;
Button btn1, btn2;
DocDetAdapter adapter1, adapter2;
int n=0;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home_act);
    lv1 = (ListView)findViewById(R.id.lv_det1);
    lv2 = (ListView)findViewById(R.id.lv_det2);
    editText = (EditText)findViewById(R.id.editText1);
    btn1 = (Button)findViewById(R.id.btn1);
    btn2 = (Button)findViewById(R.id.btn2);
    adapter1 = new DocDetAdapter(1);
    adapter2 = new DocDetAdapter(2);

    docDet1.add(new DocItem("1", "john", 20));
    docDet1.add(new DocItem("2", "james", 5));
    docDet1.add(new DocItem("3", "shaun", 60));
    docDet1.add(new DocItem("4", "joy", 10));
    docDet1.add(new DocItem("5", "mark", 1));

    lv1.setAdapter(adapter1);
    lv2.setAdapter(adapter2);

    btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            for(int j =0;j<docDet1.size();j++){
                final DocItem curItem = docDet1.get(j);
                if(curItem.name.equals(editText.getText().toString())){
                    n++;
                 DocItem docItem = docDet1.get(j);
                    docDet1.get(j).marks = n;
                    docDet2.add(0, docItem);
                    adapter1.notifyDataSetChanged();
                    adapter2.notifyDataSetChanged();
                    editText.setText("");
                    }
                }
            editText.setText("");
        }
    });

    btn2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            for(int j =0;j<docDet2.size();j++){
                final DocItem curItem = docDet2.get(j);
                if(curItem.name.equals(editText.getText().toString())){

                 DocItem docItem = docDet1.get(j);
                    docDet2.remove(j);
                    docDet1.add(0, docItem);
                    adapter1.notifyDataSetChanged();
                    adapter2.notifyDataSetChanged();
                    editText.setText("");
                    }
                }
            editText.setText("");
        }
    });
}

private class DocDetAdapter extends BaseAdapter {

    int mode; // 1 or 2

    public DocDetAdapter(int mode) {
        this.mode = mode;
    }

    @Override
    public int getCount() {
        if (mode == 1)
            return docDet1.size();
        else
            return docDet2.size();
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(final int position, View convertView,
            ViewGroup parent) {
        LayoutInflater li = getLayoutInflater();

        if (convertView == null)
            convertView = li.inflate(R.layout.row_tray_det, null);

        TextView tvItemName = (TextView) convertView
                .findViewById(R.id.tv_item_name);
        TextView tvRack = (TextView) convertView.findViewById(R.id.tv_rack);
        TextView tvQty = (TextView) convertView.findViewById(R.id.tv_qty);

        DocItem invItem;
        if (mode == 1)
            invItem = docDet1.get(position);
        else
            invItem = docDet2.get(position);

        tvItemName.setText(invItem.docNo);
        tvRack.setText(invItem.name);
        tvQty.setText(invItem.marks + "");

        return convertView;
        }
    }
  }

DocItem类

代码语言:javascript
运行
复制
public class DocItem {

public String docNo, name;
public Integer marks;

public DocItem(String docNo, String name, Integer marks) {
    super();
    this.docNo = docNo;
    this.name = name;
    this.marks = marks;
     }
  }

home_act.xml

代码语言:javascript
运行
复制
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <EditText
        android:id="@+id/editText1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="10" >
    </EditText>

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="3"
        android:text="Add" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="3"
        android:text="Sub" />
</LinearLayout>

<TextView
    android:id="@+id/textView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:gravity="center"
    android:text="list 1"
    android:textSize="20sp"
    android:textStyle="bold" >
</TextView>

<ListView
    android:id="@+id/lv_det1"
    android:layout_width="fill_parent"
    android:layout_height="200dp"
    android:layout_marginTop="10dp" />

<TextView
    android:id="@+id/textView2"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:ems="10"
    android:gravity="center"
    android:text="list 2"
    android:textSize="20sp"
    android:textStyle="bold" >
</TextView>

<ListView
    android:id="@+id/lv_det2"
    android:layout_width="fill_parent"
    android:layout_height="250dp" />

 </LinearLayout>

row_tray_det

代码语言:javascript
运行
复制
  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
    android:orientation="vertical" >

    <View
    android:id="@+id/v_doc_seperator"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    android:background="@color/blue"
    android:visibility="gone" />

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/row_bg_transparent_white"
    android:gravity="center_vertical"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/tv_rack"
        style="@android:style/TextAppearance.Medium"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:ems="5"
        android:gravity="center_vertical"
        android:padding="10dp"
        android:text="Sl no"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tv_item_name"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:text="Name"
        android:textSize="15sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/tv_qty"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:ems="10"
        android:gravity="center_vertical"
        android:paddingRight="3dp"
        android:text="Marks"
        android:textSize="16sp"
        android:textStyle="bold" />
</LinearLayout>

这里是预期输出的图像:

在上面的输出中,Joy有10个分数,如果输入Joy作为输入,那么列表应该显示在上面。

我真的需要帮助,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-26 11:44:35

据我所知,如果在editText中输入的名称与列表中的名称匹配,则减少标记1。将相同的内容添加到列表2中,并将标记设置为1。

如果单击add表示相同的名称列表,则名称的标记将减少,而list2 becomes2中的标记则会减少。

为添加部分所做的更改

代码语言:javascript
运行
复制
 btn1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            DocItem changeItem = null;
            for (int i = 0; i < docDet1.size(); i++) {
                DocItem docItem = docDet1.get(i);
                if (docItem.name.equals(editText.getText().toString())) {
                    changeItem = docDet1.get(i);
                    changeItem.marks = changeItem.marks - 1;
                    if (findDocItem(editText.getText().toString()) != null) {
                        DocItem docI = findDocItem(editText.getText().toString());
                        docI.marks = docI.marks + 1;
                    } else {
                        docDet2.add(new DocItem(changeItem.docNo, changeItem.name, 1));
                    }

                }

            }

            adapter2.notifyDataSetChanged();
            adapter1.notifyDataSetChanged();
        }
    });

寻找和寻找物品

代码语言:javascript
运行
复制
  DocItem findDocItem(String name) {
    for (DocItem item : docDet2) {
        if (item.name.equals(name)) {
            return item;
        }
    }
    return null;
}

避免在for循环中调用notifyDataSetChanged

你也会为潜艇做类似的事。

关于聊天中讨论的子部分

代码语言:javascript
运行
复制
    btn2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            int changedmarks=0;
            for (int i = 0; i < docDet2.size(); i++) {
                DocItem docItem = docDet2.get(i);
                if (docItem.name.equals(editText.getText().toString())) {
                    changedmarks =docDet2.get(i).marks;
                    docDet2.remove(i);

                }
            }
            if(findDocItem2(editText.getText().toString())!=null )
            {
                DocItem  docitem = findDocItem2(editText.getText().toString());
                docitem.marks = docitem.marks+ changedmarks;
            }

            adapter1.notifyDataSetChanged();
            adapter2.notifyDataSetChanged();
        }
    });

然后

代码语言:javascript
运行
复制
DocItem findDocItem2(String name) {
    for (DocItem item : docDet1) {
        if (item.name.equals(name)) {
            return item;
        }
    }
    return null;
 }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40259598

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档