我想在一個由arrayadapter創建併發送到listview的relativelayout上設置一個OnTouchListener。但是,由OnTouchListener觸發的代碼必須寫入設置了適配器的活動中。是否可以將偵聽器設置爲適配器中的視圖,並在活動中定義(或編碼)它?是否可以在適配器中設置OnTouchListener並從設置適配器的活動中調用它?
我的適配器:
public class MessageAdapter extends ArrayAdapter<FriendlyMessage> {
TouchInterface touchInterface;
protected AlphaAnimation fadeOut = new AlphaAnimation(1.0f , 0.0f);
protected AlphaAnimation fadeIn = new AlphaAnimation(0.0f , 1.0f);
ViewHolder viewHolder = new ViewHolder();
private static class ViewHolder {
TextView messageText;
TextView nameText;
TextView timeText;
ImageView imageView;
RelativeLayout relativeLayout;
int position;
}
public MessageAdapter(Context context, int resource, List<FriendlyMessage> objects) {
super(context, resource, objects);
}
public void setOnTouchListener(View.OnTouchListener touchListener){
this.touchInterface = (TouchInterface) touchListener;
viewHolder.relativeLayout.setOnTouchListener(touchListener);
}
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
FriendlyMessage message = getItem(position);
if (message.getPhotoUrl() != null){
if (Objects.equals(message.getKey(), String.valueOf(Build.SERIAL))){
convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_image_right, null);
viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.photoImageViewR);
viewHolder.nameText = (TextView) convertView.findViewById(R.id.nameTextView);
viewHolder.timeText = (TextView) convertView.findViewById(R.id.tvtimeimg);
Picasso.with(viewHolder.imageView.getContext())
.load(message.getPhotoUrl())
.into(viewHolder.imageView);
convertView.setTag(viewHolder);
}
else if (!Objects.equals(message.getKey(), String.valueOf(Build.SERIAL))){
convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_image_left, null);
viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.photoImageViewL);
viewHolder.nameText = (TextView) convertView.findViewById(R.id.nameTextView);
viewHolder.timeText = (TextView) convertView.findViewById(R.id.tvtimeimg);
Picasso.with(viewHolder.imageView.getContext())
.load(message.getPhotoUrl())
.into(viewHolder.imageView);
convertView.setTag(viewHolder);
}
}
else if (message.getPhotoUrl() == null){
if (Objects.equals(message.getKey(), String.valueOf(Build.SERIAL))) {
convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_text_right, null);
viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel);
viewHolder.messageText = (TextView) convertView.findViewById(R.id.messageTextView);
viewHolder.nameText = (TextView) convertView.findViewById(R.id.nameTextView);
viewHolder.timeText = (TextView) convertView.findViewById(R.id.tvtime);
viewHolder.messageText.setText(message.getText());
convertView.setTag(viewHolder);
} else if (!Objects.equals(message.getKey(), String.valueOf(Build.SERIAL))) {
convertView = ((Activity) getContext()).getLayoutInflater().inflate(R.layout.item_message_text_left, null);
viewHolder.relativeLayout = (RelativeLayout) convertView.findViewById(R.id.rel);
viewHolder.messageText = (TextView) convertView.findViewById(R.id.messageTextView);
viewHolder.nameText = (TextView) convertView.findViewById(R.id.nameTextView);
viewHolder.timeText = (TextView) convertView.findViewById(R.id.tvtime);
viewHolder.messageText.setText(message.getText());
convertView.setTag(viewHolder);
}
}
//some other code here
return convertView;
}}
TouchInterface:
public interface TouchInterface {
void touch(View.OnTouchListener onTouchListener);}
而且我的活動,在這裏我想呼叫的監聽器(它的長碼,所以我刪除了一些零件,現在是不重要):
public class MessageActivity extends AppCompatActivity implements TouchInterface{
private static final String TAG = "MessageActivity";
public static final String ANONYMOUS = "anonymous";
public static final int DEFAULT_MSG_LENGTH_LIMIT = 1000;
public static final int RC_SIGN_IN = 1;
private static final int RC_PHOTO_PICKER = 2;
private ListView mMessageListView;
private MessageAdapter mMessageAdapter;
private ProgressBar mProgressBar;
private ImageButton mPhotoPickerButton;
private EditText mMessageEditText;
private Button mSendButton;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference mMessagesDatabaseReference;
private static DatabaseReference mMessagesDatabaseReference2;
private ChildEventListener mChildEventListener;
private FirebaseAuth mFirebaseAuth;
private FirebaseAuth.AuthStateListener mAuthStateListener;
private FirebaseStorage mFirebaseStorage;
private StorageReference mStorageReference;
private String mUsername;
private Toolbar toolbar;
private String key = Build.SERIAL;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
private SimpleDateFormat sdft = new SimpleDateFormat("HH:mm");
private String time = sdft.format(new Date());
private String date = sdf.format(new Date());
public View.OnTouchListener listener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_message);
toolbar = (Toolbar) findViewById(R.id.toolbar);
assert toolbar != null;
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
mUsername = ANONYMOUS;
mFirebaseDatabase = FirebaseDatabase.getInstance();
mFirebaseAuth = FirebaseAuth.getInstance();
mMessagesDatabaseReference = mFirebaseDatabase.getReference().child("messages");
mMessagesDatabaseReference2 = mFirebaseDatabase.getReference().child("touches");
mFirebaseStorage = FirebaseStorage.getInstance();
mStorageReference = mFirebaseStorage.getReference().child("photos");
// Initialize references to views
mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
mMessageListView = (ListView) findViewById(R.id.messageListView);
mPhotoPickerButton = (ImageButton) findViewById(R.id.photoPickerButton);
mMessageEditText = (EditText) findViewById(R.id.messageEditText);
mSendButton = (Button) findViewById(R.id.sendButton);
// Initialize message ListView and its adapter
List<FriendlyMessage> friendlyMessages = new ArrayList<>();
mMessageAdapter = new MessageAdapter(this, 0, friendlyMessages);
mMessageListView.setAdapter(mMessageAdapter);
mMessageAdapter.setOnTouchListener(listener);
//some other code here
}
//some other code here
@Override
public void touch(View.OnTouchListener listener1) {
this.listener = listener1;
Log.i(TAG, "touched");
listener = new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.i("TAG", "touched down");
break;
case MotionEvent.ACTION_MOVE:
Log.i("TAG", "moving: (" + x + ", " + y + ")");
break;
case MotionEvent.ACTION_UP:
Log.i("TAG", "touched up");
break;
}
mMessagesDatabaseReference2.push().setValue(x, y);
return false;
}
};
}}
您應該設置一個項目點擊活動 –
ListView上的監聽器我也試過,但問題是,如果我在列表視圖上設置監聽器,滾動變得越野車,如果我滑動,它只能移動10 dp。 – DaGee
請顯示您的代碼。 –