OnClickItem,Android项目数量未知

时间:2016-11-19 15:25:54

标签: android listview onitemclicklistener onitemclick

我有一个对象数组。在我的listview中,我只传递这些对象的名称,但当有人点击其中任何一个时,我想要一个新窗口弹出并查看我的项目中的额外信息。我能以某种方式这样做吗?

这就是我的列表活动的样子:

public class ListItemsActivity extends ListActivity {
    String[] mTestArray;
    ListView listView;
    private static final String TAG = "ListActivity";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "Trying to create the list activitye");
        super.onCreate(savedInstanceState);
        ArrayAdapter<String> adapter;

        mTestArray = getResources().getStringArray(R.array.sections);
        ArrayList<Sweet> sweets = getSweets(mTestArray);
        ArrayList<String> result = getSweetsNames(mTestArray);
        Log.d(TAG, mTestArray.toString());

        adapter = new ArrayAdapter<String>(
                this,
                R.layout.activity_list_items,
                result;
        setListAdapter(adapter);
    }

    public void onListItemClick(ListView parent, View v, int position, long id) {
        parent.setItemChecked(position, parent.isItemChecked(position));

        Toast.makeText(this, "You have selected " + mTestArray[position],
                Toast.LENGTH_SHORT).show();
    }

所以这没关系,它给我看了一些名字。当我点击它们时,它会告诉我一个小弹出的东西,我选择了它。我想要的实际上是打开一个新窗口并显示我的项目中的所有信息。那可能吗?我该如何去做呢?

我发现的唯一方法是做这样的事情:

public void onItemClick(AdapterView<?> parent, View view,
  int position, long id) {
   switch( position ) {
     case 0:  Intent newActivity = new Intent(this, i1.class);     
              startActivity(newActivity);
              break;
     case 1:  Intent newActivity = new Intent(this, i2.class);     
              startActivity(newActivity);
              break;
     case 2:  Intent newActivity = new Intent(this, i3.class);     
              startActivity(newActivity);
              break;
     case 3:  Intent newActivity = new Intent(this, i4.class);     
              startActivity(newActivity);
              break;
     case 4:  Intent newActivity = new Intent(this, i5.class);     
              startActivity(newActivity);
              break;
    }
}

但出于以下原因,这是一个糟糕的方法: 1)我有不明数量的元素 2)我没有为每个项目有1000个活动,我想要1个通用窗口,它取决于某个整数位置。

我可以这样做吗?

4 个答案:

答案 0 :(得分:3)

如果您从listView获取该项目的位置,那么我认为您可以通过使用适配器获取有关该项目的信息。

您可以尝试的代码:

  1. 制作列表视图项目的xml:
  2. 这可以包括任何类型的项目,并且可以在列表视图中看到您想要显示的项目。我正在创建一个名为 list_items_view.xml 的xml,并在listview中只包含一个文本视图。

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <TextView
            android:id="@+id/nameInList"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="26dp"
            android:padding="7dp"/>
    
    </RelativeLayout>
    
    1. 创建一个包含要与每个列表项绑定的项目的类:
    2. 这里我将每个列表项与它的描述,价格和卡路里绑定(你可以根据需要改变它),并为每一个创建构造函数和getter-setter方法。类的名称是的 ListDetailsClass

      public class ListDetailsClass {
      
          String price,name, description,calories;
      
          public String getPrice() {
              return price;
          }
      
          public void setPrice(String price) {
              this.price = price;
          }
      
          public ListDetailsClass(String price, String name, String description, String calories) {
              this.price = price;
              this.name = name;
              this.description = description;
              this.calories = calories;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getDescription() {
              return description;
          }
      
          public void setDescription(String description) {
              this.description = description;
          }
      
          public String getCalories() {
              return calories;
          }
      
          public void setCalories(String calories) {
              this.calories = calories;
          }
      }
      
      1. 制作一个可以在一个项目中调整xml和类的属性的适配器:
      2. 这里我创建了一个扩展 BaseAdapter 的适配器类,并根据我的用途实现了它的方法。类的名称是 adapterForLV :< / p>

        public class adapterForLV extends BaseAdapter {
        
            ArrayList<ListDetailsClass> itemsInList;
            Context mContext;
        
            LayoutInflater inflater;
        
            public Context getmContext() {
                return mContext;
            }
        
            public void setmContext(Context mContext) {
                this.mContext = mContext;
            }
        
            public ArrayList<ListDetailsClass> getItemsInList() {
                return itemsInList;
            }
        
            public void setItemsInList(ArrayList<ListDetailsClass> itemsInList) {
                this.itemsInList = itemsInList;
            }
        
            public adapterForLV(ArrayList<ListDetailsClass> itemsInList, Context mContext) {
                this.itemsInList = itemsInList;
                this.mContext = mContext;
            }
        
            @Override
            public int getCount() {
                return itemsInList.size();
            }
        
            @Override
            public Object getItem(int position) {
                return itemsInList.get(position);
            }
        
            @Override
            public long getItemId(int position) {
                return position;
            }
        
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
        
                if(inflater == null){
                    inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                }
                if(convertView == null){
                    convertView = inflater.inflate(R.layout.list_items_view,null);
                }
        
                TextView nameOfItem = (TextView) convertView.findViewById(R.id.nameInList);
        
                ListDetailsClass items = itemsInList.get(position);
        
                String name = items.getName();
        
                nameOfItem.setText(items.getName());
        
                return convertView;
            }
        }
        
        1. 最后在主要活动中实施适配器,以便包含带有绑定数据的列表项:(活动名称为 MainActivity

          ListView listView;
          
          ArrayList<ListDetailsClass> list = new ArrayList<>();
          
          adapterForLV customAdapter;
          
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
          
              listView = (ListView) findViewById(R.id.lv) ;
          
          //Adapted the list form with customAdapter
          
              customAdapter = new adapterForLV(list,this);
          
          //Set the listview to the customAdapter
          
              listView.setAdapter(customAdapter);
          
          //Made two new objects of the ListDetaisClass to add data in the listview 
          
              ListDetailsClass newData = new ListDetailsClass("3$","abc","description","543 cal");
              ListDetailsClass newData2 = new ListDetailsClass("35.3$","item name","description about item","callories about it");
          
          //Added data to the list
          
              list.add(newData);
              list.add(newData2);
          
          
          //Listview item click listener implementation
              listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
              @Override
              public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
          
                  String name = customAdapter.getItemsInList().get(position).getName();
                  String description = customAdapter.getItemsInList().get(position).getDescription();
                  String price = customAdapter.getItemsInList().get(position).getPrice();
                  String calories = customAdapter.getItemsInList().get(position).getCalories();
          
          
          //Intent to pass the data of the list item to next activity
          
                  Intent i = new Intent(getApplicationContext(),Main2Activity.class);
                  i.putExtra("Item_Name",name);
                  i.putExtra("Item_Desc",description);
                  i.putExtra("Item_Price",price);
                  i.putExtra("Item_cal",calories);
                  startActivity(i);
          
              }
              });
          
          }
          
        2. 根据我们在新活动中的用途获取表单中显示的数据:

        3. 在这里,你必须为新活动定义一个新的xml,以便数据可以以我们想要的形式显示。

          <强> Main2Activity

          //defined textViews to show my data
          TextView itemName,itemDescription,itemPrice,itemCal;
          
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main2);
              Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
              setSupportActionBar(toolbar);
          
              itemName = (TextView) findViewById(R.id.ItemName);
              itemDescription = (TextView) findViewById(R.id.ItemDescr);
              itemCal = (TextView) findViewById(R.id.ItemCal);
              itemPrice = (TextView) findViewById(R.id.ItemPrice);
          
          //Getting data from oldActivity i.e. MainActivity
              Intent i = getIntent();
          
          //Setting data to textViews
              itemName.setText("Name: "+i.getStringExtra("Item_Name"));
              itemDescription.setText("Description: "+i.getStringExtra("Item_Desc"));
              itemPrice.setText("Price: "+i.getStringExtra("Item_Price"));
              itemCal.setText("Calories: "+i.getStringExtra("Item_cal"));
          
          
          }
          

          实施后的屏幕截图

          1. 列表视图
          2. Listview

            1. 新活动中的商品详情
            2. item details

              希望这对你有帮助!

答案 1 :(得分:1)

我不太了解但您可以将Intent用于新窗口例如:

public void onListItemClick(ListView parent, View v, int position, long id) {
    parent.setItemChecked(position, parent.isItemChecked(position));

   Intent intent=new Intent(ListItemActivity.this, newDetailActivity.class);  //newDetailActivity is a Activity you need to create or can say redirect window
 startActivity(intent);  // This opens a window
}

此处的官方文档了解更多信息Component-Relative Paths in Angular 2

答案 2 :(得分:1)

您可以开始一项公共活动,并将所选项目与意图一起传递:

public void onListItemClick(ListView parent, View v, int position, long id) {
    parent.setItemChecked(position, parent.isItemChecked(position));

    //DetailsActivity is the activity which shows the extra details
    Intent intent=new Intent(ListItemActivity.this, DetailsActivity.class);  

    //Add the item that the user clicked on, the class has to implement Parcelable or Serializable
    intent.putExtra("data", sweets.getItem(position));
    startActivity(intent);  // This opens a window
}

在已打开的活动中,您可以从意图中获取该项目并显示其内容:

//in newDetailActivity :
Sweet s = getIntent().getExtras.getParcelable("data");

答案 3 :(得分:0)

在活动之间传递数据的最简单方法是使用意图。

public void onItemClick(AdapterView<?> parent, View view,
          int position, long id) {

     Intent newActivity = new Intent(this, i1.class);
     newActivity.putExtra("id", postion);
     newActivity.putExtra("key", value);        
     startActivity(newActivity);

    }

简而言之,putExtra方法需要一个键和值 可在目的地活动中检索。

Bundle extras = getIntent().getExtras();
String id,key;
    if(extras == null) {
        id = null;
        key = null; 
    } else {
        id= extras.getString("id");
        key= extras.getString("key");
    }