单击特定项目时,从listview获取listitem(使用单选按钮自定义)

时间:2014-06-02 12:22:19

标签: android listview android-listview listitem

我准备了自定义Listview,因为我想从视图中选择一个项目,所以我已经使用了RadioButton视图作为单选项目,但我自定义了它。以下是我的总代码,因为布局中可能有错误所以请帮我解决这个问题。

活动: -

public class MainActivity extends Activity {
TextView tvEmpty;
ListView listView;
Spinner spnStage;
Button btnGet;

String sfrom;
ArrayList<String> arrayList;
StartFromAdapter arrayAdapter;

String[] stages = { "School", "Collage", "Office" };
String resultdata = "{\"Age\":{\"School\":[{\"Stage\":\"class1\",\"Name\":\"Classname1\"},{\"Stage\":\"class2\",\"Name\":\"ClassName2\"}],\"Collage\":[],\"Office\":[{\"Stage\":\"Office1\",\"Name\":\"Officename1\"},{\"Stage\":\"Office2\",\"Name\":\"Officename2\"}]}}";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    tvEmpty = (TextView) findViewById(R.id.emptytv);
    listView = (ListView) findViewById(R.id.lstDemo);
    spnStage = (Spinner) findViewById(R.id.spinner1);
    btnGet = (Button) findViewById(R.id.button1);

    ArrayAdapter<String> stageAdapter = new ArrayAdapter<String>(
            MainActivity.this, android.R.layout.simple_spinner_item, stages);
    stageAdapter
            .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spnStage.setAdapter(stageAdapter);
    arrayList = new ArrayList<String>();
    spnStage.setOnItemSelectedListener(new OnItemSelectedListener() {

        @Override
        public void onItemSelected(AdapterView<?> parent, View v, int pos,
                long id) {

            if (arrayList.size() > 0 && arrayList != null) {
                arrayList.clear();
            }
            loadListView(parent.getSelectedItem().toString());
        }

        @Override
        public void onNothingSelected(AdapterView<?> arg0) {

        }
    });
    btnGet.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            int selectedPosition = (Integer) v.getTag();
            Log.i("SELECTED IN GET", "" + selectedPosition);
        }
    });
}

public void loadListView(String selectedItem) {
    try {
        JSONObject jObject = new JSONObject(resultdata);
        JSONObject jAge = jObject.getJSONObject("Age");
        JSONArray jSelectedItem = jAge.getJSONArray(selectedItem);

        if (jSelectedItem.length() != 0) {

            for (int i = 0; i < jSelectedItem.length(); i++) {
                JSONObject jObj = jSelectedItem.getJSONObject(i);
                arrayList.add(jObj.getString("Name"));
            }

        }
        arrayAdapter = new StartFromAdapter(this, arrayList);
        arrayAdapter.notifyDataSetChanged();
        listView.setAdapter(arrayAdapter);
        listView.setEmptyView(tvEmpty);
        Log.i("BEFORE LISTVIEW ONCLICK", "THIS IS ADDRESSLIST");
        listView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View v, int pos,
                    long id) {
                sfrom = ((RadioButton) v.findViewById(R.id.startfromrb))
                        .getText().toString();
                Log.i("STARTFROM", sfrom);
            }

        });

    } catch (JSONException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
}

适配器: -

public class StartFromAdapter extends BaseAdapter {
ArrayList<String> detailsArrayList;
Context context;
int selectedPosition = 0;

public StartFromAdapter(Context context, ArrayList<String> detailsArrayList) {
    this.detailsArrayList = detailsArrayList;
    this.context = context;
}

@Override
public int getCount() {
    // TODO Auto-generated method stub
    return detailsArrayList.size();
}

@Override
public Object getItem(int position) {
    // TODO Auto-generated method stub
    return detailsArrayList.get(position);
}

@Override
public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LinearLayout rowLayout = null;

    if (convertView == null) {
        rowLayout = (LinearLayout) LayoutInflater.from(context).inflate(
                R.layout.listitem_view, parent, false);
    } else {
        rowLayout = (LinearLayout) convertView;
    }
    RadioButton rbStartFrom = (RadioButton) rowLayout
            .findViewById(R.id.startfromrb);
    rbStartFrom.setChecked(position == selectedPosition);
    rbStartFrom.setTag(position);

    rbStartFrom.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            selectedPosition = (Integer) v.getTag();
            notifyDataSetInvalidated();
            Log.i("IN ADAPTER", "" + selectedPosition);
        }
    });

    rbStartFrom.setText(detailsArrayList.get(position));

    return rowLayout;

}

}

MAINLAYOUT: -

<?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="fill_parent"
android:orientation="vertical" >

<Spinner
    android:id="@+id/spinner1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<ListView
    android:id="@+id/lstDemo"
    android:layout_width="fill_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/spinner1"
    android:layout_marginBottom="60dp" >
</ListView>

<TextView
    android:id="@+id/emptytv"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/spinner1"
    android:layout_marginBottom="60dp"
    android:gravity="center_vertical|center_horizontal"
    android:text="No Records Found."
    android:textSize="25sp" />

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_marginLeft="31dp"
    android:text="Button" />

 </RelativeLayout>

listitem_view: -

<?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:descendantFocusability="blocksDescendants"
android:orientation="horizontal" >

<RadioButton
    android:id="@+id/startfromrb"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:button="@null"
    android:drawableRight="@android:drawable/btn_radio"
    android:focusable="false"
    android:focusableInTouchMode="false"
    android:lines="3"
    android:paddingLeft="20dp"
    android:text="RadioButton" />

</LinearLayout>

2 个答案:

答案 0 :(得分:0)

我看到的第一个是,你必须更改你想在下面设置其他视图的视图的引用:

   <Spinner
android:id="@+id/spinner1"
android:layout_width="match_parent"
android:layout_height="wrap_content" />

  <ListView
android:id="@+id/lstDemo"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_below="@+id/spinner1"  <!-- correct: @id/spinner1 -->
android:layout_marginBottom="60dp" >
  </ListView>

  <TextView
android:id="@+id/emptytv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/spinner1"  <!-- correct: @id/spinner1 -->
android:layout_marginBottom="60dp"
android:gravity="center_vertical|center_horizontal"
android:text="No Records Found."
android:textSize="25sp" />

  <Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_marginLeft="31dp"
android:text="Button" />

  </RelativeLayout>

但无论如何,你的TextView直接位于listView上方,这是你的意图吗?如果没有,你必须设置

android:layout_below="@+id/lstDemo" 

此外,如果您收到任何错误,请发布logcat输出。如果您的布局有问题,请详细说明您想要的内容。

修改

尝试获取所选项目String,如下所示:

      final String item = (String) parent.getItemAtPosition(position);
      loadListView(item);

答案 1 :(得分:0)

按照以下更新使用代码

// On item click listener 
listView.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> arg0, View view, int position,long itemId) {
                RadioButton btn=(RadioButton) view.findViewById(R.id.startfromrb);
        String sfrom = btn.getText().toString();
        arrayAdapter.setSelected((int)itemId);
                Log.i("STARTFROM", sfrom);
       }
});


//Add below function in adapter class
public void setSelected(int selectedPosition){
    this.selectedPosition=selectedPosition;
    notifyDataSetChanged();
}

同时从适配器

中删除
rbStartFrom.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            selectedPosition = (Integer) v.getTag();
            notifyDataSetInvalidated();
            Log.i("IN ADAPTER", "" + selectedPosition);
        }
    });

添加android:clickable="false"并默认将selectedPosition设置为-1