【问题标题】:Get selected item from customadapter listview Android从 customadapter listview Android 中获取所选项目
【发布时间】:2013-10-30 11:28:28
【问题描述】:

我一直在做的是关于 customadapter。现在我想从我的列表视图中获取选定的项目,但它的适配器是自定义的。在我的列表视图中,我有一个图像、标题和标题,我想获取所选项目,在我的情况下只是标题。我该怎么做?

这是我迄今为止尝试过的:

    @Override
public void onItemClick(AdapterView<?> parent, View v, int pos, long id) {
    String strHouseName = "house_name";
    String strHousePrice = "house_price";
    //String selectedFromList =(String) (lv.getItemAtPosition(pos));
    Intent i;

    switch(pos){
    case 0:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "5 Dina Retreat, Carrum Downs");
        i.putExtra(strHousePrice, "$300,000.00");
        startActivity(i);
        break;
    case 1:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 941 Cob Terrace, Clyde North");
        i.putExtra(strHousePrice, "$800,000.00");
        startActivity(i);
        break;
    case 2:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 932 Ventasso Street, Clyde");
        i.putExtra(strHousePrice, "$1,000,000.00");
        startActivity(i);
        break;
    case 3:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 515 Summerhill Blvd, Drouin");
        i.putExtra(strHousePrice, "$300,000.00");
        startActivity(i);
        break;
    case 4:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 17 Todman Street, Drouin (Option 2)"); 
        i.putExtra(strHousePrice, "$550,000.00");
        startActivity(i);
        break;
    case 5:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 32 Aqueduct Road, Langwarrin");
        i.putExtra(strHousePrice, "$600,000.00");
        startActivity(i);
        break;
    case 6:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Units 2-7, 269 North Road, Langwarin");
        i.putExtra(strHousePrice, "$450,000.00");
        startActivity(i);
        break;
    case 7:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "U 39, 40-60 Potts Road, Langwarrin");
        i.putExtra(strHousePrice, "$1,300,000.00");
        startActivity(i);
        break;
    case 8:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 1 McClenaghan Place, Pakenham");
        i.putExtra(strHousePrice, "$2,000,000.00");
        startActivity(i);
        break;
    case 9:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 2 McClenaghan Place, Pakenham");
        i.putExtra(strHousePrice, "$300,000.00");
        startActivity(i);
        break;
    case 10:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 3 McClenaghan Place, Pakenham");
        i.putExtra(strHousePrice, "$900,000.00");
        startActivity(i);
        break;
    case 11:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 4 McClenaghan Place, Pakenham");
        i.putExtra(strHousePrice, "$600,000.00");
        startActivity(i);
        break;
    case 12:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 5 McClenaghan Place, Pakenham");
        i.putExtra(strHousePrice, "$1,200,000.00");
        startActivity(i);
        break;
    case 13:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 7 McClenaghan Place, Pakenham");
        i.putExtra(strHousePrice, "$700,000.00");
        startActivity(i);
        break;
    case 14:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 11 McClenaghan Place, Pakenham");
        i.putExtra(strHousePrice, "$500,000.00");
        startActivity(i);
        break;
    case 15:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 12 McClenaghan Place, Pakenham");
        i.putExtra(strHousePrice, "$3,000,000.00");
        startActivity(i);
        break;
    case 16:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 532 Summerhill Blvd, Drouin");
        i.putExtra(strHousePrice, "$300,000.00");
        startActivity(i);
        break;
    case 17:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 17 Ajax Street, Drouin");
        i.putExtra(strHousePrice, "$300,000.00");
        startActivity(i);
        break;
    case 18:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 133 Mountainview Blvd, Cranbourne North");
        i.putExtra(strHousePrice, "$300,000.00");
        startActivity(i);
        break;
    case 19:
        i = new Intent(this, ViewHouse.class);
        i.putExtra(strHouseName, "Lot 531 Summerhill Blvd, Drouin");
        i.putExtra(strHousePrice, "$300,000.00");
        startActivity(i);
        break;
    default: Log.d(strHouseName, "No such house name available");
    } 

}


    class MyCustomAdapter extends BaseAdapter
{
    String[] data_text1;
    String[] data_text2;
    int[] data_image;

MyCustomAdapter() {
    data_text1 = null;
    data_text2 = null;
    data_image = null;
}

MyCustomAdapter(int[] image, String[] house, String[] price) {
    data_text1 = house;
    data_text2 = price;
    data_image = image;
}

public int getCount() {
    return data_text1.length;
}

public String getItem(int position) {
    return null;
}

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

public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = getLayoutInflater();
    View row;

    row = inflater.inflate(R.layout.listrow, null);

    TextView textview1 = (TextView) row.findViewById(R.id.text1);
    TextView textview2 = (TextView) row.findViewById(R.id.text2);
    ImageView imageview = (ImageView) row.findViewById(R.id.image);

    imageview.setScaleType(ImageView.ScaleType.FIT_XY);
    textview1.setText(data_text1[position]);
    textview2.setText("$" + (new DecimalFormat("#,###.00")).format(Double.parseDouble(data_text2[position])) );
    imageview.setImageResource(data_image[position]);

    return (row);

    }
}

同时,我只是通过它的位置,但问题是,如果列表已排序怎么办?怎样才能得到正确的选中项?有任何想法吗?我很乐意欣赏它。谢谢。

【问题讨论】:

  • 您应该为您的列表视图使用数据集类和 viewHolder 类,之后您将能够将选择的行数据发送到下一个活动。
  • @praveenSharma 你能给我一些示例代码吗? ty
  • 我发布一个代码作为答案如果您有任何疑问,那么您可以问。

标签: java android listview android-listview


【解决方案1】:

试试这个..

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

    TextView textview1 = (TextView) v.findViewById(R.id.text1);
    TextView textview2 = (TextView) v.findViewById(R.id.text2);

    Log.v("textview1",textview1.getText().toString().trim());
    Log.v("textview2",textview2.getText().toString().trim());

}

【讨论】:

  • 这有帮助,但是如果我滚动列表选择的项目会随机更改并选择多个项目,这是什么问题?
【解决方案2】:

在项目点击获取当前视图,获取它的 UI 元素 ex TextView 标题,并将它们发送到意图

@Override
public void onItemClick(AdapterView<?> parent, View v, int pos, long id)
{
    if (v== null)
        v= inflater.inflate(R.layout.list_row_layout, null); // reached in case of listview bug in android which is a little chance but to make sure not to crash on NPE    
    String title = ((TextView) v.findViewById(R.id.list_row_title)).getText();
    String price = ((TextView) v.findViewById(R.id.list_row_price)).getText();

    i = new Intent(this, ViewHouse.class);
    i.putExtra(strHouseName, title );
    i.putExtra(strHousePrice, price );
    startActivity(i);
}

【讨论】:

    【解决方案3】:

    举个例子

    //数据集类

    public class HouseData{
    
        //private String HouseName= "";
        private String HousePrice = "";
    
        /*public String getHouseName() {
            return HouseName;
        }
        public void setHouseName(String HouseName) {
            this.HouseName= HouseName;
        }*/
        public String getHousePrice () {
            return HousePrice ;
        }
        public void setHousePrice (String HousePrice ) {
            this.HousePrice = HousePrice ;
        }
    

    //viewholder类为:-

     public class ViewHolder
            {
                public TextView tv_HousePrice,tv_HouseName
    
            }
    

    //这里是getview方法。

    public View getView(final int position, View convertView,
                    ViewGroup parent) {
    
                final ViewHolder holder;
                //holder=new ViewHolder();
    
                View listrow = convertView;
    
                activity.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);
    
                if (listrow == null) {
    
                    LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                    listrow = vi.inflate(R.layout.your_listview_item_layout, null);
    
                    holder=new ViewHolder();
                    holder.tv_HouseName=(TextView)listrow.findViewById(R.id.tv_name);
    
    
                    holder.tv_HousePrice=(EditText)listrow.findViewById(R.id.tv_price);
                    listrow.setTag(holder);
    
                }
                else
                    holder=(ViewHolder)listrow.getTag();
                listrow.setBackgroundColor(((position % 2)!=0) ? Color.rgb(229,229,229) : Color.WHITE);
    
                try {
                    houseData= getItem(position);
    
    
    
                    if (houseData!= null) { 
    
                        holder.tv_HouseName.setText(""+houseData.getHouseName());
                        holder.tv_HousePrice.setText(""+houseData.getHousePrice());
    
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                    e.printStackTrace();
                }
    
                listrow.setOnClickListener(new OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
    //here you can pass complete data object to next activity
    }
                });
    
    
                return listrow;
            }
    

    【讨论】:

    • 看到这里我只是放了一些我工作中的代码。这里 workorderAssetCharactorDataset = getItem(position);你回答了吗
    • 这里我根据您的要求放置代码。希望对您有所帮助。
    【解决方案4】:

    尝试获取视图。 通过 id 将其解析到您的 textview。获取文本并继续

    【讨论】:

      【解决方案5】:

      试试这个..

      public void onItemClick(AdapterView<?> parent, View v, int pos, long id) {
          // Type cast to what the layout you used in the xml i.e, for the list item
          // For example i took the RelativeLayout
          if(v instanceOf RelativeLayout){
              RelativeLayout layout = (RelativeLayout) v;
              TextView title = (TextView) layout.findViewById(R.id.conFormat_Name);
              System.out.println(title.getText());
          } 
      
      }
      

      【讨论】:

        【解决方案6】:

        您可以创建一个成员来在您的自定义适配器中保存选定的索引,例如...

        private int selectedIndex;
        

        然后在自定义适配器及其getter和setter的构造函数中将其初始化为selectedIndex = -1...

        public void setSelectedIndex(int index) {
            this.selectedIndex = index;
        }
        
        public int getSelectedIndex() {
            return selectedIndex;
        }
        

        最后,您只需在 setter 中传递适配器 onItemClickposition 参数,然后使用 getter 在任何您想要的地方获取所选项目。

        一旦你维护了 selectedIndex,你就可以很容易地得到选中的项目,比如..

        public BookInfo getSelectedItem() {
            if (selectedIndex <= -1 || selectedIndex >= items.size()) {
                return null;
            } else {
                return items.get(selectedIndex);
            }
        }
        

        希望这会有所帮助...:)

        【讨论】:

        • 嗯,我不认为这会有所帮助,但谢谢,我不是在寻找索引,而是在寻找项目本身。
        猜你喜欢
        • 1970-01-01
        • 2011-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多