在ListView中重复的行 [英] Rows being repeated in ListView

查看:89
本文介绍了在ListView中重复的行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道这个问题已经出现过很多次了,但是由于某种原因,我似乎无法使其正常工作. 在某些情况下,多次调用getView的事实.

I know this question has appeared a number of times but for some reason I can't seem to get it to work. The fact that getView is called multiple times in certain cases.

但是,在此处给出的示例中: http://android.amberfog.com/?p = 296 它说,对数据中每一行的第一次调用应在currentView中获得一个空值. 这没有发生.

However, in the example given here: http://android.amberfog.com/?p=296 it says that the first call for each row in the data should get a null value in currentView. This is not happening.

发生的事情是,位置为0时的调用将currentView设置为null,而位置为1时的调用将currentView设置为现有对象.

What is happening for me is that the calls when position is 0 has currentView set to null whereas the calls where position is 1 has currentView set to an existing object.

总共对"getView"进行了16次调用,但是我得到的行重复了一次(即每行两次). 第0行 第1行 第0行 第1行

In total 16 calls are made to "getView" but I get the rows duplicated once (i.e two of each row). Row 0 Row 1 Row 0 Row 1

我可能只是不了解那篇文章.

I probably just didn't understand something from that post.

布局:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"   
    android:layout_height="fill_parent"
    >
    <TextView android:id="@+id/title_paired_devices" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/title_paired_devices" 
        android:visibility="gone"
        android:background="#666"
        android:textColor="#fff"
        android:paddingLeft="5dp"
    />
    <ListView android:id="@+id/paired_devices"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:stackFromBottom="true"
        android:layout_weight="1"
    />
    <TextView android:id="@+id/title_new_devices"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/title_other_devices"
        android:visibility="gone"
        android:background="#666"
        android:textColor="#fff"
        android:paddingLeft="5dp"
    />
    <ListView android:id="@+id/new_devices"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:stackFromBottom="true"
        android:layout_weight="2"
    />
    <Button android:id="@+id/button_scan" 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/button_scan"
    />
</LinearLayout>

列表视图行:

    <?xml version="1.0" encoding="utf-8"?>
 <RelativeLayout xmlns:android="http://schemas.

android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/list_selector"
    android:orientation="horizontal"
    android:padding="5dip" >

    <!--  ListRow Left side Thumbnail image -->
    <LinearLayout android:id="@+id/thumbnail"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="3dip"
        android:layout_alignParentLeft="true"
        android:background="@drawable/image_bg"
        android:layout_marginRight="5dip">

        <ImageView
            android:id="@+id/list_image"
            android:layout_width="50dip"
            android:layout_height="50dip"
            android:src="@drawable/icon"/>

    </LinearLayout>

    <!-- Device Address -->
    <TextView
        android:id="@+id/tvwDeviceAddress"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/thumbnail"
        android:layout_toRightOf="@+id/thumbnail"
        android:textColor="#040404"
        android:typeface="sans"
        android:textSize="15dip"
        android:textStyle="bold"/>

    <!-- Display Name -->
    <TextView
        android:id="@+id/tvwDisplayName"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/tvwDeviceAddress"
        android:textColor="#343434"
        android:textSize="10dip"
        android:layout_marginTop="1dip"
        android:layout_toRightOf="@+id/thumbnail"/>


</RelativeLayout>

适配器:

    private class LazyAdapter extends BaseAdapter {

    private Activity activity;
    private ArrayList<MPGDeviceDetails> data;
    private LayoutInflater inflater=null;

    public LazyAdapter(Activity a, ArrayList<MPGDeviceDetails> d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public int getCount() {
        return data.size();
    }

    public Object getItem(int position) {
        return position;
    }

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

    public View getView(int position, View convertView, ViewGroup parent) {
        View vi=convertView;
        Log.e("MPG","Position = " + position + ".  ConvertView = " + convertView);
        if(convertView==null)
            vi = inflater.inflate(R.layout.device_name, null);

        TextView address = (TextView)vi.findViewById(R.id.tvwDeviceAddress); // Device Address
        TextView name = (TextView)vi.findViewById(R.id.tvwDisplayName); // Display name
        ImageView thumb_image=(ImageView)vi.findViewById(R.id.list_image); // thumb image



        address.setText(data.get(position).deviceAddress);
        name.setText(data.get(position).getDisplayName());
        Bitmap photo = data.get(position).getContactPhoto();
        if (photo != null)
            thumb_image.setImageBitmap(photo);


        return vi;
    }
}

用法:

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Setup the window
    requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.device_list);

    // Set result CANCELED incase the user backs out
    setResult(Activity.RESULT_CANCELED);

    // Initialize the button to perform device discovery
    Button scanButton = (Button) findViewById(R.id.button_scan);
    scanButton.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            doDiscovery();
            v.setVisibility(View.GONE);
        }
    });

    // Initialize array adapters. One for already paired devices and
    // one for newly discovered devices


    // Find and set up the ListView for paired devices
    pairedListView = (ListView) findViewById(R.id.paired_devices);
    pairedDevicesList = new ArrayList<MPGDeviceDetails>();
    pairedListView.setAdapter((mPairedDevicesArrayAdapter = new LazyAdapter(this,pairedDevicesList)));
    pairedListView.setOnItemClickListener(mDeviceClickListener);
    registerForContextMenu(pairedListView);

    // Get the local Bluetooth adapter
    mBtAdapter = BluetoothAdapter.getDefaultAdapter();

    // Get a set of currently paired devices
    Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();

    // If there are paired devices, add each one to the ArrayAdapter
    if (pairedDevices.size() > 0) {
        findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
        for (BluetoothDevice device : pairedDevices) {
          pairedDevicesList.add(MPGDeviceDetailsControl.getDeviceDetails(this, device.getAddress(), device.getName()));
        }
    } 

}

MPGDeviceDetails是一个对象,其中包含有关特定设备的所有数据.

MPGDeviceDetails is an object that holds all the data about a specific device.

这是调试"命令的输出:

This is the output from the "debug" command:

03-27 10:03:30.730: E/MPG(2841): Position = 0.  ConvertView = null.
03-27 10:03:30.742: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@4062d608. 
03-27 10:03:30.746: E/MPG(2841): Position = 0.  ConvertView = null. 
03-27 10:03:30.750: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@40628d78. 
03-27 10:03:30.750: E/MPG(2841): Position = 0.  ConvertView = android.widget.RelativeLayout@4062d608. 
03-27 10:03:30.753: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@4062d608. 
03-27 10:03:30.753: E/MPG(2841): Position = 0.  ConvertView = android.widget.RelativeLayout@40628d78. 
03-27 10:03:30.753: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@40628d78. 
03-27 10:03:30.761: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@4062d608. 
03-27 10:03:30.761: E/MPG(2841): Position = 0.  ConvertView = null. 
03-27 10:03:30.769: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@40628d78. 
03-27 10:03:30.769: E/MPG(2841): Position = 0.  ConvertView = null. 
03-27 10:03:30.777: E/MPG(2841): Position = 0.  ConvertView = null. 
03-27 10:03:30.781: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@406d4af8. 
03-27 10:03:30.781: E/MPG(2841): Position = 0.  ConvertView = null. 
03-27 10:03:30.785: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@40694970. 
03-27 10:03:30.789: E/MPG(2841): Position = 0.  ConvertView = android.widget.RelativeLayout@406d4af8. 
03-27 10:03:30.789: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@406d4af8. 
03-27 10:03:30.789: E/MPG(2841): Position = 0.  ConvertView = android.widget.RelativeLayout@40694970. 
03-27 10:03:30.792: E/MPG(2841): Position = 1.  ConvertView = android.widget.RelativeLayout@40694970. 

这是屏幕上的样子:

This is what the screen looks like:

有趣的是,虽然所有4个按钮都起作用,但是上下文菜单仅对前两个起作用!

Funny thing is that, whilst all 4 buttons work, the context-menu only works for the first two!

推荐答案

在完成填充pairedDevicesList时,尝试在适配器上调用notifyDataSetChanged():

Try calling notifyDataSetChanged() on your adapter when you've finished filling pairedDevicesList:

if (pairedDevices.size() > 0) {
    findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
    for (BluetoothDevice device : pairedDevices) {
        pairedDevicesList.add(MPGDeviceDetailsControl.getDeviceDetails(this, device.getAddress(), device.getName()));
    }
}
((BaseAdapder)getListAdapter()).notifyDataSetChanged();

或填充pairedDevicesList后创建适配器.

还要尝试说明您适配器的数据具有稳定的ID:

Also try stating that your adapter's data has stable ids:

@Override
public boolean hasStableIds() {
    return true;
}

这篇关于在ListView中重复的行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆