2017-10-11 19 views
0

データベースのテーブル名を持つ動的なボタンを表示するリストビューを作成しました。ユーザーがボタンをクリックすると、ボタンのテキストをつかんで、それを次のアクティビティーに渡してデータベース表に対応する情報を入力し、そのテキストを画面の上部に表示することになっています。私が書いたコードは、ボタンをクリックするとクラッシュする。呼び出す必要があるか、ボタンで動作しないコードがありますか?Androidのリストビューonclicklistenerと動的ボタン

public class UserArea extends AppCompatActivity { 

SectionListAdapter sectionListAdapter; 
ListView listView; 

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

TextView tvWelcomeMsg = (TextView) findViewById(R.id.tvWelcome); 

/**Get Sections and Display as buttons*/ 
listView = (ListView) findViewById(R.id.lvSections); 
sectionListAdapter = new SectionListAdapter(this, R.layout.section_layout); 
listView.setAdapter(sectionListAdapter); 

Response.Listener<String> responseListener = new Response.Listener<String>() { 
    @Override 
    public void onResponse(String response) { 
     try { 

      JSONObject jsonResponse = new JSONObject(response); 
      boolean success = jsonResponse.getBoolean("success"); 
      /** If data successfully gathered*/ 
      if (success) { 

       JSONArray jsonArray= jsonResponse.getJSONArray("Flights"); 

       int count = 0; 

       String flight; 

       while(count<jsonArray.length()) { 

        JSONObject SL = jsonArray.getJSONObject(count); 
        flight = SL.getString("Flight"); 

        SectionList sl = new SectionList(flight); 
        sectionListAdapter.add(sl); 

        count++; 

       } 

      } 
      /** If data is not gathered*/ 
      else { 
       AlertDialog.Builder builder = new AlertDialog.Builder(UserArea.this); 
       builder.setMessage("Failed to connect") 
         .setNegativeButton("Retry", null) 
         .create() 
         .show(); 
      } 
     } 
     /** if any other response is received*/ 
     catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } 
}; 

/**Creates Request to get the data*/ 
GetSectionRequest getSections = new GetSectionRequest(responseListener); 
/**Creates a queue to run the code*/ 
RequestQueue queue = Volley.newRequestQueue(UserArea.this); 
queue.add(getSections); 

/**End*/ 

/**Creates onclicklistener to pass clicked section name*/ 

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int i, long id) { 

     Intent intent = new Intent (UserArea.this, Personnel.class); 
     intent.putExtra("section", listView.getItemAtPosition(i).toString()); 
     UserArea.this.startActivity(intent); 
    } 
}); 

SectionListAdapter

public class SectionListAdapter extends ArrayAdapter { 

    List list = new ArrayList(); 

    public SectionListAdapter(Context context, int resource) { 
     super(context, resource); 
    } 


    public void add(SectionList object) { 
     super.add(object); 
     list.add(object); 
    } 

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

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

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

     View row; 
     row = convertView; 

     SectionListAdapter.SectionListHolder sectionListHolder; 

     if (row == null){ 
      LayoutInflater layoutInflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = layoutInflater.inflate(R.layout.section_layout, parent, false); 
      sectionListHolder = new SectionListAdapter.SectionListHolder(); 
      sectionListHolder.bSection = row.findViewById(R.id.bSectionName); 

     }else{ 

      sectionListHolder = (SectionListAdapter.SectionListHolder)row.getTag(); 

     } 
     SectionList SectionList = (SectionList) this.getItem(position); 
     sectionListHolder.bSection.setText(SectionList.getFlight()); 



     return row; 
    } 

    static class SectionListHolder{ 

     Button bSection; 
    } 
} 

ログイン猫

10-10 19:31:26.797 6595-6595/com.example.yikes.recall E/AndroidRuntime: 
FATAL EXCEPTION: main 
Process: com.example.yikes.recall, PID: 6595 
java.lang.NullPointerException: Attempt to read from field 'android.widget.Button com.example.yikes.recall.SectionListAdapter$SectionListHolder.bSection' on a null object reference 
+1

もっとコードやエラーログを投稿してください。 – Jerrol

+0

これはあなたの質問に答えます** java.lang.NullPointerException:フィールド 'android.widget.Button com.example.yikes.recall.SectionListAdapter $ SectionListHolder.bSection'から空のオブジェクト参照を読み込もうとしました**多分レイアウトあなたの** bSection **があなたのレイアウトに見つかりません、あなたはXMLレイアウトを再確認してみてください。 – Jerrol

+0

@Jerrol bSectionは、ボタンが格納されるはずのSectionListAdapterにあります。おそらく、私はそれを間違って作成しました... – Kirakos

答えて

0

私は、tryコードです:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     final ListView listView = new ListView(this); 
     listView.setBackgroundColor(Color.WHITE); 
     setContentView(listView); 

     final String[] activities = new String[]{"Item1", "Item2", "Item3", "Item4"}; 
     ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line); 
     listView.setAdapter(adapter); 

     for (String item : activities) { 
      adapter.add(item); 
     } 


     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String item = listView.getItemAtPosition(position).toString(); 
       Intent intent = new Intent(MainActivity.this, SampleActivity.class); 
       intent.putExtra("item", item); 
       MainActivity.this.startActivity(intent); 
      } 
     }); 
    } 

それは働いて、私は

考えます
/**Creates Request to get the data*/ 
GetSectionRequest getSections = new GetSectionRequest(responseListener); 
/**Creates a queue to run the code*/ 
RequestQueue queue = Volley.newRequestQueue(UserArea.this); 
queue.add(getSections); 

アプリケーションを起動するときにProgressDialogを追加し、応答コールバックを終了するときに時間を要します。それがあなたを助けることを願っています!

+0

私はListViewを作成するために使用したコードを追加しました。それが助けになるなら、私はアダプタを追加することができます。 – Kirakos

+0

私は仕事をやめた後にこれを試してみます。これもresponse.listenerに入れる必要がありますか?私はオンラインのSQLデータベースからテーブルを引っ張っています。 – Kirakos

+0

sqlからデータを取得すると、接続にはconnectとqueryの時間が必要です。試してみてください。 – Dungnbhut

関連する問題