Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 滚动listview后,无法将项目添加到listview_Android_Android Layout_Listview - Fatal编程技术网

Android 滚动listview后,无法将项目添加到listview

Android 滚动listview后,无法将项目添加到listview,android,android-layout,listview,Android,Android Layout,Listview,在使用Onclick Listener功能插入文本和图像后,当屏幕变满时,即当列表变为可滚动时,当我尝试添加新项目并向下滚动列表时,我看到列表的第一个项目已添加到列表中,而不是必须添加到列表中的当前项目 自定义列表视图 public class CustomListView extends ListActivity { ArrayList<Item> imageArry = new ArrayList<Item>(); //CustomImageAdapter adapt

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

自定义列表视图

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);


}
}

main.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>

textlayout.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"/>

resultimage.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" />


问题在于适配器的getView方法,在listview中,将重用屏幕外的视图,而不是创建新视图,因此该视图将包含第一个视图的详细信息

尝试用下面的方法替换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;
}

因此,我们需要在回收的视图中再次设置详细信息。

您已经为listview设置了
fill\u parent
。这将覆盖整个屏幕,但我已经使用了列表视图的填充父对象,所以它将占据整个屏幕。其中是其他元素的空间。也可以使用
match\u parent
我使用了wrap content和match parent,但它不起作用。您需要在单个列表视图中设置图像和文本视图。在adapterMy解决方案中使用getViewItemType是否有帮助,或者您还有其他问题?
<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" />
 @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;
}