質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

2259閲覧

listViewのsetOnItemClickListenerが期待通りの動作をしない

yuba_yuba

総合スコア44

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2018/07/21 15:51

編集2018/07/21 16:51

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>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

リストビューを個別に更新するようにしたら解決出来ました。

java

1 class CountTask extends TimerTask { 2 @Override 3 public void run() { 4 handler.post(new Runnable() { 5 public void run() { 6 7// adapter.notifyDataSetChanged(); 8 9 for (int i=0;i<list.size();i++){ 10 View targetView = listView.getChildAt(i); 11 listView.getAdapter().getView(i, targetView, listView); 12 } 13 } 14 }); 15 } 16 }

投稿2018/07/24 02:41

yuba_yuba

総合スコア44

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問