Android ListView错误的项目更新

时间:2015-08-14 05:12:44

标签: android listview android-listview bluetooth

首先,我将解释我想要做什么,我将发布下面的代码。 我有一个蓝牙服务,一个带有自定义适配器的ListView和一个用于蓝牙服务的处理程序,如果手机已连接则会通知||连接||从BT设备中删除。

我的ListView包含附近的蓝牙设备,点击项目标签,例如,更新,手机将连接到该设备。

假设我有2个BT设备。如果我将选择第一个标签将更新(这是正确的),但如果我选择项目号。 2,由于某种原因它更新也是第一个标签< - 这是问题

我在我的应用程序中使用片段,ListViewAdapter的代码和方法在下面更新:

列表视图适配器代码:

public class BluetoothListViewAdapter extends ArrayAdapter<HashMap<String, String>>{

    Context ctx;
    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private LayoutInflater inflater = null;
    CircularProgressButton Device = null;

    public BluetoothListViewAdapter(Activity a, ArrayList<HashMap<String, String>> d) {
        super(a,R.layout.template_bluetooth_listview_element,d);

        ctx = a.getBaseContext();
        activity = a;
        data = d;
        inflater = (LayoutInflater) a.getBaseContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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



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


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
       String TAG;
       String MAC;

        View vi = convertView;

        if (vi == null)
            vi = inflater.inflate(R.layout.template_bluetooth_listview_element, null);

        Device = null;
        Device = (CircularProgressButton) vi.findViewById(R.id.CircularProgressButton_BluetoothListElement);



        HashMap<String, String> category = new HashMap<String, String>();
        category = data.get(position);

        TAG = (category.get("TAG"));
        MAC = (category.get("MAC"));

        Device.setText(TAG + "\n" + MAC);
        Device.setIdleText(TAG + "\n" + MAC);

        if(GlobalActivity.CurrentDeviceTAG.equals(TAG) && GlobalActivity.CurrentDeviceMAC.equals(MAC) && position == GlobalActivity.CurrentDevicePosition) { // if the selected device is the one i am connected

            if (GlobalActivity.BluetoothConnectionStatus == GlobalActivity.STATE_CONNECTED) {
                Device.setIndeterminateProgressMode(false);
                Device.setProgress(100); // -- update GUI Element
            }

            if (GlobalActivity.BluetoothConnectionStatus == GlobalActivity.STATE_NONE) {
                Device.setIndeterminateProgressMode(false);
                Device.setProgress(0); // -- update GUI Element
            }

        }

        return vi;
    }

}

BLUETOOTH FRAGMENT CODE(在公共静态int中尝试连接时保存位置):

public void BluetoothStateChanged(int position){
        Adapter.getView(position, null, null);
        Adapter.notifyDataSetChanged();
        BluetoothDeviceListView.setAdapter(Adapter);


    }

以上方法由状态变更上的蓝牙服务处理程序调用 - 这个更新是GUI元素。

抱歉我的英语不好和解释。我有27H没睡觉。

我真的需要解决这个问题。

感谢您的时间

请求更新 - LISTVIEW项目布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#424242">

    <com.dd.CircularProgressButton
        android:id="@+id/CircularProgressButton_BluetoothListElement"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_marginTop="16dp"
        android:textColor="#FFFFFF"
        android:textSize="18sp"
        app:cpb_cornerRadius="48dp"
        app:cpb_iconComplete="@drawable/ic_action_accept"
        app:cpb_iconError="@drawable/ic_action_cancel"
        android:focusable="false"
        android:clickable="false" />

</LinearLayout>

2 个答案:

答案 0 :(得分:1)

您需要创建一个带有进度条的类,每当您在getView()中创建一个视图时,都将此持有者类设置为标记。

请参阅以下代码:

           <div id="loaderText">
                <p>Please wait while downloading data.</p><br />
                <p>This may take a few minutes.</p>
            </div>

答案 1 :(得分:0)

public void BluetoothStateChanged(){
        int start = BluetoothDeviceListView.getFirstVisiblePosition();
        for(int i = start, j = BluetoothDeviceListView.getLastVisiblePosition(); i<=j; i++) {
            View view = BluetoothDeviceListView.getChildAt(i - start);
            if ((BluetoothDeviceListView.getItemAtPosition(i)) != null) {
                BluetoothDeviceListView.getAdapter().getView(i, view, BluetoothDeviceListView); // Tell the adapter to update this view
            }

        }
    }