listViewでタイマーを作成しようとしています
ボタンを押すとタイマーが起動してカウントアップを開始しタイマー起動中にlistViewのアイテムをタップすると数値がリセットされる、というのが狙った動作です
ですが自分のコードだとリセットされたりされなかったりしてしまいます
恐らくアダブターを繰り返しnotifyDataSetChangedしているのが原因だと思うのですが解決方法が分かりません。
リスナーが必ず反応するようにするにはどのようにすれば良いのでしょうか?
以下がコードになります
Java
1//MainActivity.java 2 3import android.content.Context; 4import android.os.Handler; 5import android.support.v7.app.AppCompatActivity; 6import android.os.Bundle; 7import android.view.LayoutInflater; 8import android.view.View; 9import android.view.ViewGroup; 10import android.widget.AdapterView; 11import android.widget.BaseAdapter; 12import android.widget.Button; 13import android.widget.ListView; 14import android.widget.TextView; 15import java.util.ArrayList; 16import java.util.List; 17import java.util.Timer; 18import java.util.TimerTask; 19 20public class MainActivity extends AppCompatActivity { 21 22 private List<Long> list=new ArrayList<>(); 23 private Timer timer; 24 private Handler handler = new Handler(); 25 BaseAdapter adapter; 26 27 @Override 28 protected void onCreate(Bundle savedInstanceState) { 29 super.onCreate(savedInstanceState); 30 setContentView(R.layout.activity_main); 31 32 for (int i=0;i<5;i++){ 33 list.add(0L); 34 } 35 36 ListView listView = findViewById(R.id.listView); 37 38 adapter = new ListAdapter(this.getApplicationContext(), 39 R.layout.list_item, list); 40 41 listView.setAdapter(adapter); 42 43 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 44 @Override 45 public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 46 list.set(position,0L); 47 } 48 }); 49 50 Button button=findViewById(R.id.button); 51 button.setOnClickListener(new View.OnClickListener() { 52 @Override 53 public void onClick(View view) { 54 timer = new Timer(); 55 CountTask cTask = new CountTask(); 56 timer.schedule(cTask, 0, 20); 57 } 58 }); 59 60 Button button2=findViewById(R.id.button2); 61 button2.setOnClickListener(new View.OnClickListener() { 62 @Override 63 public void onClick(View view) { 64 if(timer!=null){ 65 timer.cancel(); 66 timer=null; 67 } 68 } 69 }); 70 71 72 } 73 74 class ListAdapter extends BaseAdapter { 75 private LayoutInflater inflater; 76 private int layoutID; 77 private List<Long> data; 78 79 class ViewHolder { 80 TextView text; 81 } 82 83 84 ListAdapter(Context context, int itemLayoutId, 85 List<Long> count) { 86 layoutID = itemLayoutId; 87 inflater = LayoutInflater.from(context); 88 data = count; 89 90 91 } 92 @Override 93 public View getView(int position, View convertView, ViewGroup parent) { 94 ViewHolder holder; 95 96 if (convertView == null) { 97 convertView = inflater.inflate(layoutID, null); 98 holder = new ViewHolder(); 99 holder.text = convertView.findViewById(R.id.number); 100 convertView.setTag(holder); 101 102 } else { 103 holder = (ViewHolder) convertView.getTag(); 104 } 105 106 holder.text.setText(String.valueOf(list.get(position))); 107 108 return convertView; 109 } 110 111 @Override 112 public int getCount() { 113 return data.size(); 114 } 115 116 @Override 117 public Object getItem(int position) { 118 return position; 119 } 120 121 @Override 122 public long getItemId(int position) { 123 return position; 124 } 125 126 127 } 128 129 class CountTask extends TimerTask { 130 @Override 131 public void run() { 132 handler.post(new Runnable() { 133 public void run() { 134 for (int i=0;i<5;i++){ 135 long l=list.get(i); 136 l++; 137 list.set(i,l); 138 } 139 adapter.notifyDataSetChanged(); 140 } 141 }); 142 } 143 } 144} 145
以下xmlです
xml
1<?xml version="1.0" encoding="utf-8"?> 2 3<!--list_item.xml--> 4 5<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 6 android:layout_width="match_parent" 7 android:layout_height="wrap_content" 8 android:orientation="horizontal" 9 android:padding="10dp"> 10 11 <TextView 12 android:id="@+id/number" 13 android:layout_width="match_parent" 14 android:layout_height="wrap_content" 15 android:gravity="center" 16 android:padding="5dp" 17 android:textSize="30sp" /> 18</LinearLayout>
<?xml version="1.0" encoding="utf-8"?> <!--activity_main.xml--> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="start" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/button" android:text="stop" /> <ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_below="@+id/button2" /> </RelativeLayout>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。