android - 滚动 ListView 后无法将项目添加到 ListView

标签 android android-layout listview

好吧,在屏幕变满时使用 Onclick 监听器功能插入文本和图像后,即当列表变为可滚动时,当我尝试添加新项目时,当我向下滚动列表时,我看到第一个项目列表已添加到列表中,而不是必须添加到列表中的当前项目。

自定义 ListView

public class CustomListView extends ListActivity {
ArrayList<Item> imageArry = new ArrayList<Item>();
//CustomImageAdapter adapter;
private MyCustomAdapter mAdapter;

Button a, b;
EditText abc;
String result;
ListView dataList;

Item abcd;


@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    abc = (EditText) findViewById(R.id.one);
    a = (Button) findViewById(R.id.button);
    b = (Button) findViewById(R.id.button2);


    mAdapter = new MyCustomAdapter(this);


    a.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            result = abc.getText().toString();


            mAdapter.addItem(new Item(result));


        }
    });


    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            mAdapter.addSeparatorItem(new Item(R.drawable.google));


        }
    });
    setListAdapter(mAdapter);


}

我的自定义适配器

public class MyCustomAdapter extends BaseAdapter {

private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
Context context;


private ArrayList<Item> mData = new ArrayList<Item>();
private LayoutInflater mInflater;

private TreeSet<Integer> mSeparatorsSet = new TreeSet<Integer>();

public MyCustomAdapter(Context context) {
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    this.context = context;
}

public void addItem(final Item item) {
    mData.add(item);
    notifyDataSetChanged();
}

public void addSeparatorItem(final Item item) {
    mData.add(item);
    // save separator position
    mSeparatorsSet.add(mData.size() - 1);
    notifyDataSetChanged();
}

@Override
public int getItemViewType(int position) {
    return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}

@Override
public int getViewTypeCount() {
    return TYPE_MAX_COUNT;
}

@Override
public int getCount() {
    return mData.size();
}

@Override
public Item getItem(int position) {
    return mData.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    Item myImage = mData.get(position);
    int type = getItemViewType(position);
    System.out.println("getView " + position + " " + convertView + " type = " + type);
    if (convertView == null) {
        holder = new ViewHolder();
        switch (type) {
            case TYPE_ITEM:
                convertView = mInflater.inflate(R.layout.textlayout, null);
                holder.textView = (TextView) convertView.findViewById(R.id.resulttext);
                holder.textView.setText(myImage.getName());
                break;
            case TYPE_SEPARATOR:
                convertView = mInflater.inflate(R.layout.resultimage, null);
                holder.img = (ImageView) convertView.findViewById(R.id.resultimage);
                holder.img.setImageResource(myImage.getImage());
                break;
        }
        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }


    return convertView;
}


public static class ViewHolder {
    public TextView textView;
    public ImageView img;
}

项目.java

public class Item {

int image;
String name;

public Item(int image, String name) {
    super();
    this.image = image;
    this.name = name;
}
public Item(String name) {
    super();
    this.name = name;
}

public Item() {

}

public Item(int image) {
    super();
    this.image=image;
}

public int getImage() {
    return image;
}
public void setImage(int image) {
    this.image = image;
}
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

主.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="0.55"
    android:cacheColorHint="#00000000"></ListView>


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

    <EditText
        android:id="@+id/one"
        android:layout_width="230dp"

        android:layout_height="wrap_content" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="a"
        android:id="@+id/button"/>


    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="b"
        android:id="@+id/button2"/>
</LinearLayout>

文本布局.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_height="wrap_content"
android:orientation="vertical">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/resulttext"/>

结果图片.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
    android:id="@+id/resultimage"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

最佳答案

问题出在 Adapter 的 getView 方法中,在 listview 中,离开屏幕的 View 将被重用而不是创建新 View ,因此 View 将具有第一个 View 的详细信息。

尝试用下面的方法替换您的 getView 方法,它应该可以解决第一项再次出现的问题。

 @Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    Item myImage = mData.get(position);
    int type = getItemViewType(position);
    System.out.println("getView " + position + " " + convertView + " type = " + type);
    if (convertView == null) {
        holder = new ViewHolder();
        switch (type) {
            case TYPE_ITEM:
                convertView = mInflater.inflate(R.layout.textlayout, null);
                holder.textView = (TextView) convertView.findViewById(R.id.resulttext);
                //holder.textView.setText(myImage.getName());
                break;
            case TYPE_SEPARATOR:
                convertView = mInflater.inflate(R.layout.resultimage, null);
                holder.img = (ImageView) convertView.findViewById(R.id.resultimage);
               // holder.img.setImageResource(myImage.getImage());
                break;
        }

    } else {
        holder = (ViewHolder) convertView.getTag();
    }
switch (type) {
case TYPE_ITEM:
                holder.textView.setText(myImage.getName());
                break;
 case TYPE_SEPARATOR:           
                holder.img.setImageResource(myImage.getImage());
                break;
}
convertView.setTag(holder);
    return convertView;
}

因此,我们需要重新设置被回收的 View 的详细信息。

关于android - 滚动 ListView 后无法将项目添加到 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31085642/

相关文章:

android - 使用 ScrollView 在模拟器上看不到按钮

android - 如何在屏幕底部设置android TabLayout?

android - 在android中计算用户和POI(兴趣点)之间的角度

android - 尽管有 rawResponse,errorBody() 在 Retrofit2 中返回 null

android - ConstraintLayout 不允许我设置将 View 连接到屏幕边缘的约束

android - 联系人应用程序,如 android 上的滚动列表

c# - UWP ObservableCollection 排序和分组

android - Recycler View 列表适配器更新 UI 不正确

android - 如何使用 facebook sdk 4.1.2 从 android 到 facebook 分享标题和描述

android - 如何让我的 Android 应用程序在 RTL 和 LTR 语言上看起来一样?