2016-11-19 25 views
0

我有一個對象數組。在我的列表視圖中,我僅傳遞這些對象的名稱,但是當有人點擊它們中的任何一個時,我想要一個新窗口彈出並查看我的項目中的額外信息。我能以某種方式做到嗎?具有未知數量的項目的OnClickItem Android

這是我的名單活動看起來像:

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(); 
    } 

因此,這是確定的,它讓我的名字的lsit。當我點擊它們時,它會告訴我一個我選擇它的小彈出物。我想要的實際上是打開一個新窗口並顯示來自我的項目的所有信息。那可能嗎?我將如何去做這件事?

我發現的唯一辦法是做這樣的事情:

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周的活動對於每個項目,我想要一個通用窗口,這取決於某個整數位置。

我可以這樣做嗎?

+0

你想要顯示什麼信息? – Swr7der

+0

我有一個名爲Sweets的類,ti有名稱,價格,說明......現在我只顯示名稱 – Mocktheduck

回答

2

如果你正在從listView中獲取物品的位置,那麼我認爲你可以通過使用Adapter獲得關於同一物品的信息。

代碼,你可以嘗試:

  1. 做一個XML,你的列表視圖中的項目將有:

這可以包括任何類型的項目和項目將在可見列表視圖,你想顯示它。我正在製作一個名爲的XML,其中list_items_view.xml爲,並且在列表視圖中只包含一個文本視圖。

<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> 
  • 做一個類,將包括要與每個列表項綁定物品:
  • 在這裏,我結合各列表項與它的描述,價格和callories(你可以根據你的需要改變),使構造函數和getter,setter方法的類的每個one.Name是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; 
        } 
    } 
    
  • 做出可能適應的XML的特性,並且在一個單一的項目類的適配器:
  • 這裏我已延伸BaseAdapter適配器類並根據我的目的使用它的方法。類的名稱是adapterForLV

    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; 
        } 
    } 
    
  • 最後在主活動實現適配器,以便包括與綁定數據的列表項:(的名稱活動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); 
    
        } 
        }); 
    
    } 
    
  • 獲取數據根據我們在新的活動中使用的形式展現:

  • 在這裏,您必須爲新活動定義一個新的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. 列表視圖

    Listview

    在新的活動
  • 項目詳細
  • item details

    希望這有助於你!

    +0

    我得到的位置,但我可以推動下一個活動的位置?讓我們來說一下Intent intent = new Intent(ListItemActivity.this,newDetailActivity.class,position); startActivity(intent); ?? – Mocktheduck

    +0

    是的,當你想開始新的活動,只需發送的intent.put – Swr7der

    +0

    的細節和/或位置我不知道的代碼,只是嘗試,如果它的工作@Mocktheduck – Swr7der

    1

    我沒有很好地理解,但你可以使用意向的新窗口例如:

    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 
    } 
    

    下面是詳細信息,官方文檔Follow Documentation

    +0

    但我有我們說1000個項目。我如何顯示信息? newDetailActivity中有什麼?它如何知道我選擇了哪個項目? – Mocktheduck

    +0

    爲了您的最佳實踐,您可以嘗試創建一個新項目並選擇主/細節流程,而不是空白活動,其中有完整的代碼和工作模型。這就是你的意思。學習並實施你的代碼介紹! –

    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 
    } 
    

    在打開的活動中,您可以從意圖中獲取該項目並顯示它的con帳篷:

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

    好吧,我會試試這個。 – Mocktheduck

    1

    在活動之間傳遞數據最簡單的方法是使用意圖。

    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"); 
        } 
    
    +1

    以及如何將onItemCLick方法添加到我的適配器? – Mocktheduck

    +0

    適配器是您數​​據和視圖之間的橋樑。你想在你的listview實例上設置監聽器 –

    相關問題