2017-01-21 36 views
0

我想在一個由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; 
     } 
    }; 
}} 
+1

您應該設置一個項目點擊活動 –

+0

ListView上的監聽器我也試過,但問題是,如果我在列表視圖上設置監聽器,滾動變得越野車,如果我滑動,它只能移動10 dp。 – DaGee

+0

請顯示您的代碼。 –

回答

0

如果我正確理解你的問題,你想設置一個列表上的點擊監聽器lement執行父活動的方法(我猜你會通過各自的參數)。如果我得到了正確的結果,你應該在你父類活動的Adapter類中定義一個變量。喜歡的東西

private MessageActivity activity; 

,然後在Adapter構造

activity = (MessageActivity) context; 

然後當你設置點擊監聽器上的觀點,你應該這樣做

view.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      // Perform action on click 
      activity.YourOnTouchMethodImplementation(); 
     } 
    }); 
+0

非常感謝你,解決了我的問題:) – DaGee

+0

不客氣:)!說實話,在架構層面上,有一種更好的方式來做到這一點,我想,當我第二天早上醒來時,我寫了這個答案:P。由於您在要執行代碼的活動中實現了TouchInterface,並且此代碼在此接口中實現,所以您可以將適配器的構造函數傳入額外的變量,如「TouchInterface touchInterface」,而不是投射您的「Context」作爲特定類型的「活動」,只需在點擊'touchInterface.Touch();'時寫入。如果你有時間嘗試一下,這是一個更好的解決方案。 –

+0

我想我會改變這個代碼,它看起來更簡單,再次感謝:) – DaGee

相關問題