2015-10-13 66 views
0

嗨,大家好,我通过本教程实现具有可点击按钮列表视图 - >https://www.youtube.com/watch?v=ZEEYYvVwJGY ,我想达到相同的输出。 但我有一个小问题,因为我的列表视图是从MySQL数据库填充,但在本教程不是从MySQL数据库填充,所以我们有一个不同的适配器。Android的列表视图与点击的按钮

代码教程

public class MainActivity extends AppCompatActivity{ 

private ArrayList<String> data = new ArrayList<String>(); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_attendance); 
     ListView lv = (ListView) findViewById(R.id.listview); 
     lv.setAdapter(new MyListAdapter(this, R.layout.list_item, data)); 
} 

} 

然后让我们假设这是教程MyListAdapter

private class MyListAdapter extends ArrayAdapter<String>{ 
    private int layout; 
    public MyListAdapter(Context context, int resource, List<String> objects) { 
     super(context, resource, objects); 
     layout = resource; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     ViewHolder mainViewHolder = null; 
     if (convertView == null){ 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(layout, parent, false); 
      ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.tvid = (TextView) convertView.findViewById(R.id.studId); 
      viewHolder.tvname = (TextView) convertView.findViewById(R.id.studName); 
      viewHolder.btnP = (Button) convertView.findViewById(R.id.present); 
      viewHolder.btnA = (Button) convertView.findViewById(R.id.absent); 
      viewHolder.btnP.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        Toast.makeText(getContext(),"Button Clicked " + position, Toast.LENGTH_LONG).show(); 
       } 
      }); 
      convertView.setTag(viewHolder); 
     } 
     return convertView; 
    } 
} 

,我的问题是,在这部分 的setAdapter

mylistView = (ListView) findViewById(R.id.list); 
       final ListAdapter adapter = new SimpleAdapter(Attendance.this, 
         studentList, R.layout.list_att, new String[]{ 
         TAG_ID, TAG_NAME}, new int[]{ 
         R.id.studId, R.id.studName}); 
       mylistView.setAdapter(adapter); 

又该我做?任何帮助,将不胜感激提前:)

感谢,这是我的代码

public class Attendance extends AppCompatActivity { 
    TextView Date;; 
    ListView mylistView; 
    private ArrayList<HashMap<String, String>> studentList = new ArrayList<HashMap<String, String>>(); 
    TextView Name; 

    private static String url = "http://10.0.2.2/MobileClassRecord/getStudent.php"; 

    private static final String TAG_STUDENTS = "students"; 
    private static final String TAG_ID = "stud_id"; 
    private static final String TAG_NAME = "stud_name"; 

    JSONArray students = null; 



    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_attendance); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     Date = (TextView) findViewById(R.id.tvDate); 
     final Calendar calendar = Calendar.getInstance(); 
     int dd = calendar.get(Calendar.DAY_OF_MONTH); 
     int mm = calendar.get(Calendar.MONTH); 
     int yy = calendar.get(Calendar.YEAR); 

     Date.setText(new StringBuilder().append(yy).append("-").append(mm + 1).append("-").append(dd)); 

     new JSONParse().execute(); 

     studentList = new ArrayList<HashMap<String, String>>(); 
    } 

    private class JSONParse extends AsyncTask<String, String, JSONObject>{ 
     private ProgressDialog pDialog; 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

      Name =(TextView) findViewById(R.id.studName); 
      pDialog = new ProgressDialog(Attendance.this); 
      pDialog.setMessage("Getting Data from Database..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(true); 
      pDialog.show(); 

     } 

     @Override 
     protected JSONObject doInBackground(String... params) { 
      JSONParser jParser = new JSONParser(); 

      JSONObject json = jParser.getJSONFromUrl(url); 
      return json; 
     } 

     @Override 
     protected void onPostExecute(JSONObject jsonObject) { 
      pDialog.dismiss(); 
      try { 
       students = jsonObject.getJSONArray(TAG_STUDENTS); 
       for (int i = 0; i < students.length(); i++){ 
        JSONObject c =students.getJSONObject(i); 

        final String Id = c.getString(TAG_ID); 
        String Name = c.getString(TAG_NAME); 

        HashMap<String, String> map = new HashMap<String, String>(); 

        map.put(TAG_ID, Id); 
        map.put(TAG_NAME, Name); 

        studentList.add(map); 
        mylistView = (ListView) findViewById(R.id.list); 
        final ListAdapter adapter = new SimpleAdapter(Attendance.this, 
          studentList, R.layout.list_att, new String[]{ 
          TAG_ID, TAG_NAME}, new int[]{ 
          R.id.studId, R.id.studName}); 
        mylistView.setAdapter(adapter); 
        mylistView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
         @Override 
         public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
          String ID = ((TextView) (view.findViewById(R.id.studId))).getText().toString(); 
          Toast.makeText(Attendance.this, "List Clicked " + ID, Toast.LENGTH_LONG).show(); 
          SharedPreferences preferences = getSharedPreferences("MyApp", MODE_PRIVATE); 
          preferences.edit().putString("id", ID).commit(); 
         } 
        }); 

       } 
      }catch (JSONException e){ 
       e.printStackTrace(); 
      } 
     } 
    } 

    private class MyListAdapter extends ArrayAdapter<String>{ 
     private int layout; 
     public MyListAdapter(Context context, int resource, List<String> objects) { 
      super(context, resource, objects); 
      layout = resource; 
     } 

     @Override 
     public View getView(final int position, View convertView, ViewGroup parent) { 
      ViewHolder mainViewHolder = null; 
      if (convertView == null){ 
       LayoutInflater inflater = LayoutInflater.from(getContext()); 
       convertView = inflater.inflate(layout, parent, false); 
       ViewHolder viewHolder = new ViewHolder(); 
       viewHolder.tvid = (TextView) convertView.findViewById(R.id.studId); 
       viewHolder.tvname = (TextView) convertView.findViewById(R.id.studName); 
       viewHolder.btnP = (Button) convertView.findViewById(R.id.present); 
       viewHolder.btnA = (Button) convertView.findViewById(R.id.absent); 
       viewHolder.btnP.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Toast.makeText(getContext(),"Button Clicked " + position, Toast.LENGTH_LONG).show(); 
        } 
       }); 
       convertView.setTag(viewHolder); 
      } 
      mainViewHolder = (ViewHolder) convertView.getTag(); 
      mainViewHolder.tvid.setText(getItem(position)); 
      return convertView; 
     } 
    } 

    public class ViewHolder{ 
     TextView tvid, tvname; 
     Button btnP, btnA; 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_attendance, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()){ 
      case android.R.id.home: 
       Intent intent = new Intent(Attendance.this, SpecificClassRecord.class); 
       startActivity(intent); 
       return true; 
      case R.id.action_view_attendance: 
       Intent intent1 = new Intent(Attendance.this, ViewAttendance.class); 
       startActivity(intent1); 
       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 
} 

Sample Layout

+2

什么是您的数据源之前?我认为你应该更清楚问题出在哪里,因为我不认为用户会观看你附加的17分钟视频。 –

+0

'最终的ListAdapter适配器=新的SimpleAdapter'你没有使用你的适配器 – njzk2

+0

'“从数据库获取数据...”'你没有访问数据库(至少没有以相关的方式) – njzk2

回答

0

像乌迪说,更多的信息将是很好。在你的代码

一个奇怪的是在getView()方法。

你有

if(convertView==null){ 
    ... 
}else{ 
... 
} 

我觉得else部分是错误的。只要删除其他和括号(而不是它的代码洞察)。 在其他部分的代码是很重要的,因为没有它,当查看加载首次的代码不会改变TextView的。这意味着,您getView不会做任何事

编辑

笔者改变了代码。你现在两个不同的适配器有...

在我看来,getView()方法应该是这样

public View getView(final int position, View convertView, ViewGroup parent) { 
    ViewHolder mainViewHolder = null; 
    if (convertView == null){ 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(layout, parent, false); 
     ViewHolder viewHolder = new ViewHolder(); 
     viewHolder.tvid = (TextView) convertView.findViewById(R.id.studId); 
     viewHolder.tvname = (TextView) convertView.findViewById(R.id.studName); 
     viewHolder.btnP = (Button) convertView.findViewById(R.id.present); 
     viewHolder.btnA = (Button) convertView.findViewById(R.id.absent); 
     viewHolder.btnP.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getContext(),"Button Clicked " + position, Toast.LENGTH_LONG).show(); 
      } 
     }); 
     convertView.setTag(viewHolder); 
    } 
    mainViewHolder = (ViewHolder) convertView.getTag(); 
    mainViewHolder.tvid.setText(getItem(position)); 
    return convertView; 
} 
} 

但对我来说仍不清楚究竟是哪里的问题。该应用程序崩溃还是只有一种你不明白的行为?如果是,那究竟是什么? 如果应用程序崩溃,什么时候到了?

编辑2:

mylistView = (ListView) findViewById(R.id.list); 
      final ListAdapter adapter = new MyListAdapter(Attendance.this, 
        R.layout.list_att, new String[]{ 
        TAG_ID, TAG_NAME}); 
      mylistView.setAdapter(adapter); 

也许这就是全部。我假设你的行的布局是由layoutressource R.layout.list_att给出的,而TAG_ID和TAG_Name是在之前的某个地方定义的。

我看到您的新适配器需要字符串列表。将下面的设置适配器

List<String> test = new ArrayList<String>(); 
test.add("1"); 
test.add("2"): 
test.add("3"); 

,然后你的适配器应该是这样的

final ListAdapter adapter = new MyListAdapter(Attendance.this, 
        R.layout.list_att, test); 
+0

我不认为否则叉是错的。但是在其他分支中的'mainViewHolder.tvid.setText(getItem(position));'可能是错误的。 – AlbAtNf

+1

取决于他想要做什么..在他的代码中,他会在第一次加载视图时将textview留空。当他滚动一下,视图必须更新时,textview将显示一些内容。我不相信这是他想要的行为 –

+0

是真的。我误解了他的代码。现在我看到他正在创建一个名为'viewHolder'的第二个'ViewHolder'。不知道,他为什么不使用他的'mainViewHolder'。然后他可以在else叉中保留'mainViewHolder =(ViewHolder)convertView.getTag();'。 – AlbAtNf

相关问题