2015-01-26 37 views
1

我的问题是,我似乎无法获取列表视图上方的操作栏,如图所示。在ListActivity内创建“向上”动作栏

enter image description here

当我使用extends ActionBarActivity我无法访问的ListView类,因此不能使用该方法,如getListView()

我试图使用这answer here并创建我自己的ListView的实现,我有一些成功。

这里的问题是我无法在点击项目时触发onListItemClick

我不知道我是否错过了一个步骤,现在需要手动调用它,在这种情况下,它可能只是我不知道/了解该方法的正确参数onListItemClick(ListView lv, View v, int position, long id)

所以我的问题分两部分。

  • 有没有办法添加“向上”按钮ListActivity
  • 我怎么叫onListItemClick方法,如果我创建类自己。

谢谢。

EditContactsActivity.java

package uk.co.jackdh.tapchat; 

import android.app.AlertDialog; 
import android.app.ListActivity; 
import android.support.v7.app.ActionBarActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.HeaderViewListAdapter; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

import com.parse.FindCallback; 
import com.parse.Parse; 
import com.parse.ParseException; 
import com.parse.ParseQuery; 
import com.parse.ParseRelation; 
import com.parse.ParseUser; 
import com.parse.SaveCallback; 

import java.util.List; 


public class EditContactsActivity extends ActionBarActivity { 

    public static final String TAG = EditContactsActivity.class.getSimpleName(); 

    protected List<ParseUser> mUsers; 
    protected ParseRelation<ParseUser> mFriendsRelation; 
    protected ParseUser mCurrentUser; 

    private ListView mListView; 

    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_edit_contacts); 

     getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 
    } 

    protected ListView getListView() { 
     if (mListView == null) { 
      mListView = (ListView) findViewById(android.R.id.list); 
     } 
     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; 
     } 
    } 

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

     mCurrentUser = ParseUser.getCurrentUser(); 
     mFriendsRelation = mCurrentUser.getRelation(ParseConstants.KEY_FRIENDS_RELATION); 

     ParseQuery<ParseUser> query = ParseUser.getQuery(); 
     query.orderByAscending(ParseConstants.KEY_USERNAME); 
     query.setLimit(1000); 
     query.findInBackground(new FindCallback<ParseUser>() { 
      @Override 
      public void done(List<ParseUser> parseUsers, ParseException e) { 
       if (e == null) { 
        //success 
        mUsers = parseUsers; 
        String[] usernames = new String[mUsers.size()]; 
        int i = 0; 
        for (ParseUser user : mUsers) { 
         usernames[i] = user.getUsername(); 
         i++; 

        } 
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(EditContactsActivity.this, android.R.layout.simple_list_item_checked, usernames); 
        getListView().setAdapter(adapter); 

        addFriendCheckMarks(); 
       } else { 
        //error 
        Log.e(TAG, e.getMessage()); 
        AlertDialog.Builder builder = new AlertDialog.Builder(EditContactsActivity.this); 
        builder.setMessage(e.getMessage()) 
          .setTitle(R.string.error_title) 
          .setPositiveButton(android.R.string.ok, null); 
        AlertDialog dialog = builder.create(); 
        dialog.show(); 
       } 
      } 
     }); 
    } 

    private void addFriendCheckMarks() { 
    mFriendsRelation.getQuery().findInBackground(new FindCallback<ParseUser>() { 
     @Override 
     public void done(List<ParseUser> parseUsers, ParseException e) { 
      if (e == null) { 
       //List returned look for match. 
       for (int i = 0; i < mUsers.size(); i++) { 
        ParseUser user = mUsers.get(i); 

        for (ParseUser contact : parseUsers) { 
         if (contact.getObjectId().equals(user.getObjectId())) { 
          getListView().setItemChecked(i, true); 
         } 
        } 
       } 
      } else { 
       Log.e(TAG, e.getMessage()); 
      } 
     } 
    }); 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    protected void onListItemClick(ListView lv, View v, int position, long id) { 
     getListView().getOnItemClickListener().onItemClick(lv, v, position, id); 

     if (getListView().isItemChecked(position)) { 
      //add friend 
      mFriendsRelation.add(mUsers.get(position)); 
     } else { 
      //remove friend 
      mFriendsRelation.remove(mUsers.get(position)); 
     } 
     mCurrentUser.saveInBackground(new SaveCallback() { 
      @Override 
      public void done(ParseException e) { 
       if (e == null) { 
//      Log.e(TAG, e.toString()); 
       } 
      } 
     }); 

    } 
} 

activity_edit_contacts.xml

<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    tools:context="uk.co.jackdh.tapchat.EditContactsActivity"> 

    <ListView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@android:id/list" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 
</RelativeLayout> 

回答

1

是否有 '向上' 按钮添加到ListActivity

的方式回答是here在Android开发者教程。基本上,您可以继续使用ActionbarActivity类并使用getActionBar().setDisplayHomeAsUpEnabled(true);方法启用它。然后,您将按照要求编号R.id.home来处理onOptionsItemSelected方法。

如果我自己创建类,该如何调用onListItemClick方法。

首先,您必须让EditContactsActivity类实现OnItemClickListener接口。

public class EditContactsActivity extends ActionBarActivity implements OnItemClickListener. 

然后你已经实现了onItemClick方法。最后,将您的课堂设置为mListView的点击监听器。

mListView.setOnItemClickListener(this); 

的详细教程是here

+0

谢谢,望着那第二个答案和教程。我实际上并不需要使用'implements OnItemClickListener',因为我可以在没有它的情况下调用'.setOnItemClickListener'。 – jackdh 2015-01-27 11:01:31