簡體   English   中英

Android Studio中的動態ListView:選擇隨機元素和更新列表視圖

[英]Dynamic ListView in Android Studio: Selecting random element and update list view

public class MyWorkout extends AppCompatActivity {
    Button addExercise
    // Record how many clicks
    int clickCounter=0;
    private ListView mListView;
    ArrayList<String> listItems = new ArrayList<String>()
    ArrayAdapter<String> adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SetContentView(R.layout.activity_my_workout);
        Toolbar MyWorkouttoolbar = (Toolbar) findViewById(R.id.MyWorkouttoolbar);
        setSupportActionBar(MyWorkouttoolbar);
        listItems.add("Power Clean");
        listItems.add("Dead Lift");
        listItems.add("Hang Clean");
        listItems.add("Military Press");
        listItems.add("Leg Press");
        listItems.add("Squat");
        listItems.add("Bench MAX");
        listItems.add("Squat MAX");
        listItems.add("Stair Stepper");
        listItems.add("Treadmill");
        listItems.add("Bike");
        listItems.add("Elliptical");
        listItems.add("Bicep Curls");
        listItems.add("Dumb Bell Squats");
        listItems.add("Goblet Squats");
        listItems.add("Bar Bell Curls");
        listItems.add("Bar Bell Bench Press");
        listItems.add("Dumb Bell Bench Press");
        listItems.add("Incline Bar Bell Bench Press");
        listItems.add("Incline Dumb Bell Bench Press");
        listItems.add("Decline Dumb Bell Bench Press");
        listItems.add("Decline Bar Bell Bench Press");
        listItems.add("Dumb Bell Lunges");
        listItems.add("Bar Bell Lunges");
        listItems.add("Dumb Bell Flys");
        listItems.add("Tricep Push Downs");

        if (mListView == null) {
            mListView = (ListView) findViewById(R.id.MyWorkoutlistView);
        }
        adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,listItems);
        setListAdapter(adapter);
        addExercise = (Button) findViewById(R.id.addExercise);
        addExercise.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Collections.shuffle(listItems);
                adapter.getItem(4);
                adapter.notifyDataSetChanged();
            }
        });
     }

     private void updateListView(){
         ListView listView = (ListView)findViewById(R.id.MyWorkoutlistView);
     }

     // method which will handle dynamic insertion
     public void addItems(View v) {
        listItems.add("Clicked : "+clickCounter++);
        adapter.notifyDataSetChanged();
     }

     protected ListView getListView(){
         if (mListView==null){
             mListView = (ListView) findViewById(R.id.MyWorkoutlistView);
         }
         return mListView;
     }

     protected void setListAdapter(ListAdapter adapter){
         getListView().setAdapter(adapter);
     }

     protected ListAdapter getListAdapter(){
         ListAdapter adapter = getListView().getAdapter();
         if (adapter instanceof HeaderViewListAdapter){
            return ((HeaderViewListAdapter)adapter).getWrappedAdapter();
        } else {
            return adapter;
        }
    }

我有一個填充練習的列表視圖。 我想隨機選擇一個數組中的元素,並將該隨機元素添加到另一個列表視圖中。

還可以更改原始練習列表視圖以僅顯示隨機元素嗎?

我是android studio的新手,所以如果我不清楚讓我知道,我會更好地解釋。 謝謝

以編程方式向自定義ListView添加/刪除項目。此示例演示如何在運行時使用Java代碼向/從自定義ListView添加/刪除項目。 請參閱此鏈接: http//android-er.blogspot.in/2015/01/add-remove-items-to-custom-listview.html

編輯1: MainActivity.java

package com.example.androidimageviewlist;

import java.util.ArrayList;
import java.util.List;

import android.support.v7.app.ActionBarActivity;
import android.app.Activity;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends ActionBarActivity {

  public class Item {
  Drawable ItemDrawable;
  String ItemString;
  Item(Drawable drawable, String t){
  ItemDrawable = drawable;
   ItemString = t;
    }
 }

 static class ViewHolder {
  ImageView icon;
  TextView text; 
  }

  public class ItemsListAdapter extends BaseAdapter {

  private Context context;
  private List<Item> list;

  ItemsListAdapter(Context c, List<Item> l){
   context = c;
   list = l;
  }

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

   @Override
   public Object getItem(int position) {
   return list.get(position);
  }

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

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

   // reuse views
  if (rowView == null) {
   LayoutInflater inflater = ((Activity) context).getLayoutInflater();
   rowView = inflater.inflate(R.layout.row, null);

   ViewHolder viewHolder = new ViewHolder();
   viewHolder.icon = (ImageView) rowView.findViewById(R.id.rowImageView);
   viewHolder.text = (TextView) rowView.findViewById(R.id.rowTextView);
   rowView.setTag(viewHolder); 
  }

  ViewHolder holder = (ViewHolder) rowView.getTag();
  holder.icon.setImageDrawable(list.get(position).ItemDrawable);
  holder.text.setText(list.get(position).ItemString);

  return rowView;
  }

  public List<Item> getList(){
   return list;
  }
 }

 List<Item> items1, items2;
 ListView listView1, listView2;
 ItemsListAdapter myItemsListAdapter1, myItemsListAdapter2;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  listView1 = (ListView)findViewById(R.id.listview1);
  listView2 = (ListView)findViewById(R.id.listview2);

  initItems();
  myItemsListAdapter1 = new ItemsListAdapter(this, items1);
  myItemsListAdapter2 = new ItemsListAdapter(this, items2);
  listView1.setAdapter(myItemsListAdapter1);
  listView2.setAdapter(myItemsListAdapter2);

  listView1.setOnItemClickListener(listOnItemClickListener);
  listView2.setOnItemClickListener(listOnItemClickListener);

    listView1.setOnItemLongClickListener(new OnItemLongClickListener(){

   @Override
   public boolean onItemLongClick(AdapterView<?> parent, View view,
     int position, long id) {
   Item selectedItem = (Item)(parent.getItemAtPosition(position));

    ItemsListAdapter associatedAdapter = (ItemsListAdapter)        (parent.getAdapter());
    List<Item> associatedList = associatedAdapter.getList();
    Item associatedItem = associatedList.get(position);
    if(removeItemToList(associatedList, associatedItem)){

     view.invalidate();
     associatedAdapter.notifyDataSetChanged();

     ItemsListAdapter list2Adapter = (ItemsListAdapter)      (listView2.getAdapter());
     List<Item> list2List = list2Adapter.getList();

      addItemToList(list2List, selectedItem);
     list2Adapter.notifyDataSetChanged();
     }

     return true;
     }});

   }

  OnItemClickListener listOnItemClickListener = new OnItemClickListener(){

  @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
    long id) {
   Toast.makeText(MainActivity.this, 
     ((Item)(parent.getItemAtPosition(position))).ItemString, 
     Toast.LENGTH_SHORT).show();
    }

 };

 private void initItems(){
  items1 = new ArrayList<Item>();
  items2 = new ArrayList<Item>();

  TypedArray arrayDrawable =     getResources().obtainTypedArray(R.array.resicon);
   TypedArray arrayText = getResources().obtainTypedArray(R.array.restext);

 for(int i=0; i<arrayDrawable.length(); i++){
  Drawable d = arrayDrawable.getDrawable(i);
   String s = arrayText.getString(i);
   Item item = new Item(d, s);
   items1.add(item);
 }

  arrayDrawable.recycle();
  arrayText.recycle();
 }

 private boolean removeItemToList(List<Item> l, Item it){
  boolean result = l.remove(it);
  return result;
  }

 private boolean addItemToList(List<Item> l, Item it){
  boolean result = l.add(it);
  return result;
 }

}    

修改activity_main.xml以擁有兩個ListView。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="4dp"
    tools:context="com.example.androidimageviewlist.MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:autoLink="web"
        android:text="http://android-er.blogspot.com/"
        android:textStyle="bold" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal"
        android:background="@android:color/background_dark" >

        <LinearLayout
            android:id="@+id/pane1"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:layout_margin="4dp"
            android:background="@android:color/background_light"
            android:orientation="vertical" >

            <ListView
                android:id="@+id/listview1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>

        <LinearLayout
            android:id="@+id/pane2"
            android:layout_width="0dp"
            android:layout_height="match_parent"
            android:layout_weight="1"
            android:layout_margin="4dp"
            android:background="@android:color/background_light"
            android:orientation="vertical" >

            <ListView
                android:id="@+id/listview2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </LinearLayout>

</LinearLayout>

我有一個填充練習的列表視圖。 我想隨機選擇一個數組中的元素,並將該隨機元素添加到另一個列表視圖中。

您可以:

  1. 使用Random.nextInt()獲取數組中的隨機位置
  2. 檢索該位置的元素,即arr[selectedPosition]
  3. 將元素放在第二個ListView的適配器中,例如使用ArrayAdapter.add()

如果不使用ArrayAdapter ,則需要實現用於添加元素的界面,或者可以使用ListView.setAdapter()創建和設置全新的適配器。

還可以更改原始練習列表視圖以僅顯示隨機元素嗎?

當然,但還有一些工作要做。 如果使用ArrayAdapter ,則只需clear()適配器,然后僅add()您要顯示的元素。 為了不丟失日期,您可以將所有練習保存在適配器外部的陣列/列表中。

如果您不使用ArrayAdapter ,並且想要實現自定義邏輯,請記住在修改后調用適配器上的notifyDataSetChanged() ,以便ListView知道刷新自身。

在這里檢查我的答案我解釋了如何將動態元素添加到列表視圖中。

以防萬一...

private EditText editTxt;
private Button btn;
private ListView list;
private ArrayAdapter<String> adapter;
private ArrayList<String> arrayList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    editTxt = (EditText) findViewById(R.id.editText);
    btn = (Button) findViewById(R.id.button);
    list = (ListView) findViewById(R.id.listView);
    arrayList = new ArrayList<String>();

    // Adapter: You need three parameters 'the context, id of the layout (it will be where the data is shown),
    // and the array that contains the data
    adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_spinner_item, arrayList);

    // Here, you set the data in your ListView
    list.setAdapter(adapter);

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            // this line adds the data of your EditText and puts in your array
            arrayList.add(editTxt.getText().toString());
            // next thing you have to do is check if your adapter has changed
            adapter.notifyDataSetChanged();
        }
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM